Mercurial > mercurial > hgweb_golang.cgi
annotate src/entai_app/entai_app.go @ 5:e4066309b04f
refactoring.
author | pyon@macmini |
---|---|
date | Sun, 23 Oct 2016 14:00:39 +0900 |
parents | ca866a38a6a0 |
children | f4ba4cfb09fd |
rev | line source |
---|---|
0 | 1 /****************************************************************************/ |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
2 /* Entai_app.go */ |
5 | 3 /* Last Change: 2016-10-23 Sun 13:23:32. */ |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
4 /* By T.Mutoh */ |
0 | 5 /****************************************************************************/ |
6 | |
7 package main | |
8 | |
9 import ( | |
1 | 10 "bufio" |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
11 "encoding/csv" |
0 | 12 "flag" |
13 "fmt" | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
14 "io" |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
15 "log" |
5 | 16 "net/http" |
0 | 17 "os" |
18 "strconv" | |
1 | 19 "strings" |
0 | 20 "time" |
21 | |
22 "entai" | |
23 ) | |
24 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
25 var ver = "0.4" |
2 | 26 var e entai.Entai |
27 | |
0 | 28 func main() { |
29 | |
30 // arguments | |
31 h := flag.Bool( "h", false, "help" ) | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
32 c := flag.String( "c", "", "config csv file" ) |
0 | 33 r := flag.Bool( "r", false, "print rate" ) |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
34 b := flag.Bool( "b", false, "batch mode" ) |
0 | 35 l := flag.Bool( "l", false, "1-liner mode" ) |
36 v := flag.Bool( "v", false, "print verbose in 1-liner mode") | |
1 | 37 i := flag.Bool( "i", false, "print input value in 1-liner mode") |
38 d := flag.Bool( "d", false, "intaracitve mode") | |
0 | 39 s := flag.Bool( "s", false, "server mode" ) |
1 | 40 p := flag.Int( "p", 8080, "listen port in server mode" ) |
0 | 41 |
42 flag.Parse() | |
43 | |
44 if flag.NFlag() == 0 { | |
2 | 45 printTile() |
0 | 46 flag.PrintDefaults() |
47 fmt.Fprint( os.Stderr, "\n" ) | |
48 os.Exit( 1 ) | |
49 } | |
50 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
51 // Setting rates |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
52 if *c == "" { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
53 e.DefaultRates() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
54 } else { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
55 f, err := os.Open( *c ); if err != nil { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
56 fmt.Fprintf( os.Stderr, "cannot open config-file : %v\n", err ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
57 os.Exit( 1 ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
58 } |
0 | 59 |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
60 r := csv.NewReader( f ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
61 r.Comment = '#' |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
62 r.TrimLeadingSpace = true |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
63 for { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
64 record, err := r.Read() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
65 if err == io.EOF { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
66 break |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
67 } else if err != nil { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
68 log.Fatal( err ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
69 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
70 e.AddRates( record[1], record[2], record[3] ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
71 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
72 f.Close() |
0 | 73 |
74 } | |
75 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
76 switch { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
77 |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
78 // Show examples |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
79 case *h : |
2 | 80 printTile() |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
81 fmt.Fprint( os.Stderr, "1-liner mode:\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
82 fmt.Fprint( os.Stderr, "> entai_app -l 30000 20160731 20161224\n\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
83 fmt.Fprint( os.Stderr, "> entai_app -i -l 29000 20160731 20161224\n\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
84 fmt.Fprint( os.Stderr, "> entai_app -i -v -l 15000 20160731 20161224\n\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
85 fmt.Fprint( os.Stderr, "> entai_app -c conf/entai.conf -l 15000 20160731 20161224\n\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
86 fmt.Fprint( os.Stderr, "batch mode:\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
87 fmt.Fprint( os.Stderr, "> entai_app -b 1.csv 2.csv ...\n\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
88 fmt.Fprint( os.Stderr, "server mode:\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
89 fmt.Fprint( os.Stderr, "> entai_app -s -p 3000\n" ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
90 os.Exit( 1 ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
91 |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
92 // Show rates |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
93 case *r : |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
94 printTile() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
95 fmt.Fprint( os.Stderr, e.GetRates() ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
96 os.Exit( 0 ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
97 |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
98 // Server-mode ( not implement ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
99 case *s : |
5 | 100 s := fmt.Sprintf( "localhost:%d", *p ) |
101 http.HandleFunc( "/", httpHandler ) | |
102 log.Fatal( http.ListenAndServe( s, nil ) ) | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
103 |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
104 // Intaractive-mode |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
105 case *d : |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
106 printTile() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
107 fmt.Print( e.GetRates() ) |
2 | 108 fmt.Print( "-----------\n\n" ) |
109 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
110 var t, d, p string |
2 | 111 for { |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
112 t = getFromTerminal( "Input Tax ", t ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
113 d = getFromTerminal( "Input Due ", d ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
114 p = getFromTerminal( "Input Paid", p ) |
2 | 115 |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
116 result, detail, err := processEntai( t, d, p ) |
2 | 117 if err != nil { |
118 fmt.Printf( "%v\n", err ) | |
119 } | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
120 fmt.Printf( " = %d", result ) |
2 | 121 |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
122 fmt.Print( "\t\t\t... Continue [Enter] / Detail [1] / Quit [9] ? " ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
123 input := bufio.NewScanner( os.Stdin ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
124 input.Scan() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
125 switch input.Text() { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
126 case "1" : |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
127 fmt.Printf( " = %s\n\n", detail ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
128 case "9" : |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
129 os.Exit( 0 ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
130 default : |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
131 } |
2 | 132 } |
1 | 133 |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
134 // 1-Liner-mode |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
135 case *l : |
2 | 136 if *i { |
137 fmt.Printf( "%s,%s,%s,", flag.Arg(0), flag.Arg(1), flag.Arg(2) ) | |
0 | 138 } |
139 | |
2 | 140 result, detail, err := processEntai( flag.Arg(0), flag.Arg(1), flag.Arg(2) ) |
141 if err != nil { | |
142 fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) | |
143 os.Exit( 1 ) | |
144 } | |
0 | 145 fmt.Print( result ) |
146 | |
147 if *v { | |
148 fmt.Print( ",", detail ) | |
149 } | |
150 fmt.Print( "\n" ) | |
2 | 151 |
1 | 152 os.Exit( 0 ) |
153 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
154 // Batch-mode |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
155 case *b : |
1 | 156 files := flag.Args() |
2 | 157 |
1 | 158 if len( files ) == 0 { |
159 fmt.Fprint( os.Stderr, "no input file.\n" ) | |
160 os.Exit( 1 ) | |
161 } else { | |
2 | 162 |
1 | 163 for _, file := range files { |
164 f, err := os.Open( file ); if err != nil { | |
165 fmt.Fprintf( os.Stderr, "cannot open file.[%v]\n", err ) | |
166 os.Exit( 1 ) | |
167 } | |
2 | 168 |
1 | 169 input := bufio.NewScanner( f ) |
170 b := bufio.NewWriter( os.Stdout ) | |
171 for input.Scan() { | |
172 s := strings.Split( input.Text(), "," ) | |
2 | 173 if strings.HasPrefix( input.Text(), "#" ) { |
174 if strings.Contains( input.Text(), "@@" ) { | |
175 buf := strings.Replace( input.Text(), "#", "", 1 ) | |
176 buf = strings.Replace( buf, "@@", "", 1 ) | |
177 fmt.Fprintf( b, "%s\n", buf ) | |
178 } | |
179 continue | |
180 } | |
181 result, detail, err := processEntai( s[0], s[1], s[2] ) | |
182 if err != nil { | |
183 fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) | |
184 os.Exit( 1 ) | |
185 } | |
186 fmt.Fprintf( b, "%s,%s,%s,%d,%s\n", s[0], s[1], s[2], result, detail ) | |
1 | 187 } |
188 b.Flush() | |
189 f.Close() | |
190 } | |
191 os.Exit( 0 ) | |
192 } | |
0 | 193 } |
194 } | |
195 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
196 // Subroutines |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
197 func processEntai( tax, due, paid string ) ( int, string, error ) { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
198 t, msg, err := validInt( tax ); if err != nil { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
199 return -1, msg, err |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
200 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
201 |
2 | 202 d, msg, err := validDate( due ); if err != nil { |
203 return -1, msg, err | |
204 } | |
205 p, msg, err := validDate( paid ); if err != nil { | |
206 return -1, msg, err | |
207 } | |
208 | |
209 e.Set( d, p, t ) | |
210 result, detail := e.Result() | |
211 | |
212 return result, detail, nil | |
0 | 213 } |
214 | |
2 | 215 func validDate( s string ) ( time.Time, string, error ) { |
216 layout := "20060102" | |
217 t, err := time.Parse( layout, s ); if err != nil { | |
218 return t, "bad date format.", err | |
219 } | |
220 return t, "", nil | |
221 } | |
222 | |
223 func validInt( s string ) ( int, string, error ) { | |
224 i, err := strconv.Atoi( s ) | |
225 if err != nil || i < 0 { | |
226 return -1, "bad money format.", err | |
227 } | |
228 return i, "", nil | |
229 } | |
230 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
231 func getFromTerminal( prompt, last string ) ( string ) { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
232 fmt.Printf( "%s > ", prompt ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
233 input := bufio.NewScanner( os.Stdin ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
234 input.Scan() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
235 s := input.Text() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
236 if s == "." { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
237 s = last |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
238 fmt.Printf( "%s > %s\n", prompt, s ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
239 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
240 return s |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
241 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
242 |
5 | 243 func httpHandler( w http.ResponseWriter, r *http.Request ) { |
244 fmt.Fprintf( w, "RemoteAddr: %q\n", r.RemoteAddr ) | |
245 if err := r.ParseForm(); err != nil { | |
246 log.Print( err ) | |
247 } | |
248 for k, v := range r.Form { | |
249 fmt.Fprintf( w, "%q: %q\n", k, v ) | |
250 } | |
251 } | |
252 | |
2 | 253 func printTile() { |
254 fmt.Fprint( os.Stderr, "\n==================================================\n" ) | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
255 fmt.Fprintf( os.Stderr, " Entai_app ver %s ( 2016.10.19 ) - since 2016\n", ver ) |
2 | 256 fmt.Fprint( os.Stderr, "==================================================\n\n" ) |
257 } | |
258 |