Mercurial > mercurial > hgweb_golang.cgi
comparison 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 |
comparison
equal
deleted
inserted
replaced
2:451c99c1d9de | 3:ca866a38a6a0 |
---|---|
1 /****************************************************************************/ | 1 /****************************************************************************/ |
2 /* Entai_app.go ( ver 0.3 ) */ | 2 /* Entai_app.go */ |
3 /* Last Change: 2016-10-13 Thu 06:04:09. */ | 3 /* Last Change: 2016-10-15 Sat 19:29:24. */ |
4 /* By T.Mutoh */ | |
4 /****************************************************************************/ | 5 /****************************************************************************/ |
5 | 6 |
6 package main | 7 package main |
7 | 8 |
8 import ( | 9 import ( |
9 "bufio" | 10 "bufio" |
11 "encoding/csv" | |
10 "flag" | 12 "flag" |
11 "fmt" | 13 "fmt" |
14 "io" | |
15 "log" | |
12 "os" | 16 "os" |
13 "strconv" | 17 "strconv" |
14 "strings" | 18 "strings" |
15 "time" | 19 "time" |
16 | 20 |
17 "entai" | 21 "entai" |
18 ) | 22 ) |
19 | 23 |
20 var ver = "0.3" | 24 var ver = "0.4" |
21 var e entai.Entai | 25 var e entai.Entai |
22 | 26 |
23 func main() { | 27 func main() { |
24 | |
25 e.Create() | |
26 | 28 |
27 // arguments | 29 // arguments |
28 h := flag.Bool( "h", false, "help" ) | 30 h := flag.Bool( "h", false, "help" ) |
31 c := flag.String( "c", "", "config csv file" ) | |
29 r := flag.Bool( "r", false, "print rate" ) | 32 r := flag.Bool( "r", false, "print rate" ) |
33 b := flag.Bool( "b", false, "batch mode" ) | |
30 l := flag.Bool( "l", false, "1-liner mode" ) | 34 l := flag.Bool( "l", false, "1-liner mode" ) |
31 b := flag.Bool( "b", false, "batch mode" ) | |
32 v := flag.Bool( "v", false, "print verbose in 1-liner mode") | 35 v := flag.Bool( "v", false, "print verbose in 1-liner mode") |
33 i := flag.Bool( "i", false, "print input value in 1-liner mode") | 36 i := flag.Bool( "i", false, "print input value in 1-liner mode") |
34 d := flag.Bool( "d", false, "intaracitve mode") | 37 d := flag.Bool( "d", false, "intaracitve mode") |
35 s := flag.Bool( "s", false, "server mode" ) | 38 s := flag.Bool( "s", false, "server mode" ) |
36 p := flag.Int( "p", 8080, "listen port in server mode" ) | 39 p := flag.Int( "p", 8080, "listen port in server mode" ) |
42 flag.PrintDefaults() | 45 flag.PrintDefaults() |
43 fmt.Fprint( os.Stderr, "\n" ) | 46 fmt.Fprint( os.Stderr, "\n" ) |
44 os.Exit( 1 ) | 47 os.Exit( 1 ) |
45 } | 48 } |
46 | 49 |
47 if *h { | 50 // Setting rates |
51 if *c == "" { | |
52 e.DefaultRates() | |
53 } else { | |
54 f, err := os.Open( *c ); if err != nil { | |
55 fmt.Fprintf( os.Stderr, "cannot open config-file : %v\n", err ) | |
56 os.Exit( 1 ) | |
57 } | |
58 | |
59 r := csv.NewReader( f ) | |
60 r.Comment = '#' | |
61 r.TrimLeadingSpace = true | |
62 for { | |
63 record, err := r.Read() | |
64 if err == io.EOF { | |
65 break | |
66 } else if err != nil { | |
67 log.Fatal( err ) | |
68 } | |
69 e.AddRates( record[1], record[2], record[3] ) | |
70 } | |
71 f.Close() | |
72 | |
73 } | |
74 | |
75 switch { | |
76 | |
77 // Show examples | |
78 case *h : | |
48 printTile() | 79 printTile() |
49 fmt.Fprint( os.Stderr, "1-liner mode:\n" ) | 80 fmt.Fprint( os.Stderr, "1-liner mode:\n" ) |
50 fmt.Fprint( os.Stderr, "> entai_app -l 20160731 20161224 30000\n\n" ) | 81 fmt.Fprint( os.Stderr, "> entai_app -l 30000 20160731 20161224\n\n" ) |
51 fmt.Fprint( os.Stderr, "> entai_app -i -l 20160731 20161224 30000\n\n" ) | 82 fmt.Fprint( os.Stderr, "> entai_app -i -l 29000 20160731 20161224\n\n" ) |
52 fmt.Fprint( os.Stderr, "> entai_app -i -v -l 20160731 20161224 30000\n\n" ) | 83 fmt.Fprint( os.Stderr, "> entai_app -i -v -l 15000 20160731 20161224\n\n" ) |
84 fmt.Fprint( os.Stderr, "> entai_app -c conf/entai.conf -l 15000 20160731 20161224\n\n" ) | |
85 fmt.Fprint( os.Stderr, "batch mode:\n" ) | |
86 fmt.Fprint( os.Stderr, "> entai_app -b 1.csv 2.csv ...\n\n" ) | |
53 fmt.Fprint( os.Stderr, "server mode:\n" ) | 87 fmt.Fprint( os.Stderr, "server mode:\n" ) |
54 fmt.Fprint( os.Stderr, "> entai_app -s -p 3000\n" ) | 88 fmt.Fprint( os.Stderr, "> entai_app -s -p 3000\n" ) |
89 os.Exit( 1 ) | |
90 | |
91 // Show rates | |
92 case *r : | |
93 printTile() | |
94 fmt.Fprint( os.Stderr, e.GetRates() ) | |
55 os.Exit( 0 ) | 95 os.Exit( 0 ) |
56 } | 96 |
57 | 97 // Server-mode ( not implement ) |
58 if *r { | 98 case *s : |
59 printTile() | |
60 fmt.Fprint( os.Stderr, e.GetRate() ) | |
61 os.Exit( 0 ) | |
62 } | |
63 | |
64 if *s { | |
65 *p = 8080 | 99 *p = 8080 |
66 fmt.Fprint( os.Stderr, "server mode is not implemented.\n" ) | 100 fmt.Fprint( os.Stderr, "server mode is not implemented.\n" ) |
67 os.Exit( 0 ) | 101 os.Exit( 1 ) |
68 } | 102 |
69 | 103 // Intaractive-mode |
70 if *d { | 104 case *d : |
71 printTile() | 105 printTile() |
72 fmt.Print( e.GetRate() ) | 106 fmt.Print( e.GetRates() ) |
73 fmt.Print( "-----------\n\n" ) | 107 fmt.Print( "-----------\n\n" ) |
74 | 108 |
109 var t, d, p string | |
75 for { | 110 for { |
76 fmt.Print( "Input Tax > " ) | 111 t = getFromTerminal( "Input Tax ", t ) |
112 d = getFromTerminal( "Input Due ", d ) | |
113 p = getFromTerminal( "Input Paid", p ) | |
114 | |
115 result, detail, err := processEntai( t, d, p ) | |
116 if err != nil { | |
117 fmt.Printf( "%v\n", err ) | |
118 } | |
119 fmt.Printf( " = %d", result ) | |
120 | |
121 fmt.Print( "\t\t\t... Continue [Enter] / Detail [1] / Quit [9] ? " ) | |
77 input := bufio.NewScanner( os.Stdin ) | 122 input := bufio.NewScanner( os.Stdin ) |
78 input.Scan() | 123 input.Scan() |
79 t := input.Text() | 124 switch input.Text() { |
80 | 125 case "1" : |
81 fmt.Print( "Input Due > " ) | 126 fmt.Printf( " = %s\n\n", detail ) |
82 input = bufio.NewScanner( os.Stdin ) | 127 case "9" : |
83 input.Scan() | 128 os.Exit( 0 ) |
84 d := input.Text() | 129 default : |
85 | 130 } |
86 fmt.Print( "Input Paid > " ) | 131 } |
87 input = bufio.NewScanner( os.Stdin ) | 132 |
88 input.Scan() | 133 // 1-Liner-mode |
89 p := input.Text() | 134 case *l : |
90 | |
91 result, _, err := processEntai( d, p, t ) | |
92 if err != nil { | |
93 fmt.Printf( "%v\n", err ) | |
94 } | |
95 fmt.Printf( " = %d\n\n", result ) | |
96 | |
97 } | |
98 } | |
99 | |
100 if *l { | |
101 if *i { | 135 if *i { |
102 fmt.Printf( "%s,%s,%s,", flag.Arg(0), flag.Arg(1), flag.Arg(2) ) | 136 fmt.Printf( "%s,%s,%s,", flag.Arg(0), flag.Arg(1), flag.Arg(2) ) |
103 } | 137 } |
104 | 138 |
105 result, detail, err := processEntai( flag.Arg(0), flag.Arg(1), flag.Arg(2) ) | 139 result, detail, err := processEntai( flag.Arg(0), flag.Arg(1), flag.Arg(2) ) |
113 fmt.Print( ",", detail ) | 147 fmt.Print( ",", detail ) |
114 } | 148 } |
115 fmt.Print( "\n" ) | 149 fmt.Print( "\n" ) |
116 | 150 |
117 os.Exit( 0 ) | 151 os.Exit( 0 ) |
118 } | 152 |
119 | 153 // Batch-mode |
120 if *b { | 154 case *b : |
121 | |
122 files := flag.Args() | 155 files := flag.Args() |
123 | 156 |
124 if len( files ) == 0 { | 157 if len( files ) == 0 { |
125 fmt.Fprint( os.Stderr, "no input file.\n" ) | 158 fmt.Fprint( os.Stderr, "no input file.\n" ) |
126 os.Exit( 1 ) | 159 os.Exit( 1 ) |
157 os.Exit( 0 ) | 190 os.Exit( 0 ) |
158 } | 191 } |
159 } | 192 } |
160 } | 193 } |
161 | 194 |
162 func processEntai( due, paid, tax string ) ( int, string, error ) { | 195 // Subroutines |
196 func processEntai( tax, due, paid string ) ( int, string, error ) { | |
197 t, msg, err := validInt( tax ); if err != nil { | |
198 return -1, msg, err | |
199 } | |
200 | |
163 d, msg, err := validDate( due ); if err != nil { | 201 d, msg, err := validDate( due ); if err != nil { |
164 return -1, msg, err | 202 return -1, msg, err |
165 } | 203 } |
166 p, msg, err := validDate( paid ); if err != nil { | 204 p, msg, err := validDate( paid ); if err != nil { |
167 return -1, msg, err | |
168 } | |
169 | |
170 t, msg, err := validInt( tax ); if err != nil { | |
171 return -1, msg, err | 205 return -1, msg, err |
172 } | 206 } |
173 | 207 |
174 e.Set( d, p, t ) | 208 e.Set( d, p, t ) |
175 result, detail := e.Result() | 209 result, detail := e.Result() |
191 return -1, "bad money format.", err | 225 return -1, "bad money format.", err |
192 } | 226 } |
193 return i, "", nil | 227 return i, "", nil |
194 } | 228 } |
195 | 229 |
230 func getFromTerminal( prompt, last string ) ( string ) { | |
231 fmt.Printf( "%s > ", prompt ) | |
232 input := bufio.NewScanner( os.Stdin ) | |
233 input.Scan() | |
234 s := input.Text() | |
235 if s == "." { | |
236 s = last | |
237 fmt.Printf( "%s > %s\n", prompt, s ) | |
238 } | |
239 return s | |
240 } | |
241 | |
196 func printTile() { | 242 func printTile() { |
197 fmt.Fprint( os.Stderr, "\n==================================================\n" ) | 243 fmt.Fprint( os.Stderr, "\n==================================================\n" ) |
198 fmt.Fprintf( os.Stderr, " Entai_app ver %s ( 2016.10.09 ) - since 2016\n", ver ) | 244 fmt.Fprintf( os.Stderr, " Entai_app ver %s ( 2016.10.19 ) - since 2016\n", ver ) |
199 fmt.Fprint( os.Stderr, "==================================================\n\n" ) | 245 fmt.Fprint( os.Stderr, "==================================================\n\n" ) |
200 } | 246 } |
201 | 247 |