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