Mercurial > mercurial > hgweb_golang.cgi
annotate src/entai_app/entai_app.go @ 11:c3a589f0521d
refine code.
author | pyon@macmini |
---|---|
date | Tue, 07 Nov 2017 21:14:31 +0900 |
parents | f4ba4cfb09fd |
children |
rev | line source |
---|---|
0 | 1 /****************************************************************************/ |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
2 /* Entai_app.go */ |
7 | 3 /* Last Change: 2016-10-28 Fri 19:33:15. */ |
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 : |
7 | 136 p := flag.Arg(2) |
137 if p == "" { | |
138 layout := "20060102" | |
139 p = time.Now().Format( layout ); | |
0 | 140 } |
141 | |
7 | 142 if *i { |
143 fmt.Printf( "%s,%s,%s,", flag.Arg(0), flag.Arg(1), p ) | |
144 } | |
145 | |
146 result, detail, err := processEntai( flag.Arg(0), flag.Arg(1), p ) | |
2 | 147 if err != nil { |
148 fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) | |
149 os.Exit( 1 ) | |
150 } | |
0 | 151 fmt.Print( result ) |
152 | |
153 if *v { | |
154 fmt.Print( ",", detail ) | |
155 } | |
156 fmt.Print( "\n" ) | |
2 | 157 |
1 | 158 os.Exit( 0 ) |
159 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
160 // Batch-mode |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
161 case *b : |
1 | 162 files := flag.Args() |
2 | 163 |
1 | 164 if len( files ) == 0 { |
165 fmt.Fprint( os.Stderr, "no input file.\n" ) | |
166 os.Exit( 1 ) | |
167 } else { | |
2 | 168 |
1 | 169 for _, file := range files { |
170 f, err := os.Open( file ); if err != nil { | |
171 fmt.Fprintf( os.Stderr, "cannot open file.[%v]\n", err ) | |
172 os.Exit( 1 ) | |
173 } | |
2 | 174 |
1 | 175 input := bufio.NewScanner( f ) |
176 b := bufio.NewWriter( os.Stdout ) | |
177 for input.Scan() { | |
178 s := strings.Split( input.Text(), "," ) | |
2 | 179 if strings.HasPrefix( input.Text(), "#" ) { |
180 if strings.Contains( input.Text(), "@@" ) { | |
181 buf := strings.Replace( input.Text(), "#", "", 1 ) | |
182 buf = strings.Replace( buf, "@@", "", 1 ) | |
183 fmt.Fprintf( b, "%s\n", buf ) | |
184 } | |
185 continue | |
186 } | |
187 result, detail, err := processEntai( s[0], s[1], s[2] ) | |
188 if err != nil { | |
189 fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) | |
190 os.Exit( 1 ) | |
191 } | |
192 fmt.Fprintf( b, "%s,%s,%s,%d,%s\n", s[0], s[1], s[2], result, detail ) | |
1 | 193 } |
194 b.Flush() | |
195 f.Close() | |
196 } | |
197 os.Exit( 0 ) | |
198 } | |
0 | 199 } |
200 } | |
201 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
202 // Subroutines |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
203 func processEntai( tax, due, paid string ) ( int, string, error ) { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
204 t, msg, err := validInt( tax ); if err != nil { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
205 return -1, msg, err |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
206 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
207 |
2 | 208 d, msg, err := validDate( due ); if err != nil { |
209 return -1, msg, err | |
210 } | |
211 p, msg, err := validDate( paid ); if err != nil { | |
212 return -1, msg, err | |
213 } | |
214 | |
215 e.Set( d, p, t ) | |
216 result, detail := e.Result() | |
217 | |
218 return result, detail, nil | |
0 | 219 } |
220 | |
2 | 221 func validDate( s string ) ( time.Time, string, error ) { |
222 layout := "20060102" | |
223 t, err := time.Parse( layout, s ); if err != nil { | |
224 return t, "bad date format.", err | |
225 } | |
226 return t, "", nil | |
227 } | |
228 | |
229 func validInt( s string ) ( int, string, error ) { | |
230 i, err := strconv.Atoi( s ) | |
231 if err != nil || i < 0 { | |
232 return -1, "bad money format.", err | |
233 } | |
234 return i, "", nil | |
235 } | |
236 | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
237 func getFromTerminal( prompt, last string ) ( string ) { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
238 fmt.Printf( "%s > ", prompt ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
239 input := bufio.NewScanner( os.Stdin ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
240 input.Scan() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
241 s := input.Text() |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
242 if s == "." { |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
243 s = last |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
244 fmt.Printf( "%s > %s\n", prompt, s ) |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
245 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
246 return s |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
247 } |
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
248 |
5 | 249 func httpHandler( w http.ResponseWriter, r *http.Request ) { |
250 fmt.Fprintf( w, "RemoteAddr: %q\n", r.RemoteAddr ) | |
251 if err := r.ParseForm(); err != nil { | |
252 log.Print( err ) | |
253 } | |
254 for k, v := range r.Form { | |
255 fmt.Fprintf( w, "%q: %q\n", k, v ) | |
256 } | |
257 } | |
258 | |
2 | 259 func printTile() { |
260 fmt.Fprint( os.Stderr, "\n==================================================\n" ) | |
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
261 fmt.Fprintf( os.Stderr, " Entai_app ver %s ( 2016.10.19 ) - since 2016\n", ver ) |
2 | 262 fmt.Fprint( os.Stderr, "==================================================\n\n" ) |
263 } | |
264 |