Mercurial > mercurial > hgweb_golang.cgi
annotate src/entai_app/entai_app.go @ 65:0369656be06c default tip
many changes.
| author | pyon@macmini |
|---|---|
| date | Fri, 20 May 2022 06:30:34 +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 |
