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 |
