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