convert transaction with = to normal but pass isSet=true
parent
a4bf52d0e9
commit
0267819b45
|
|
@ -14,6 +14,7 @@ type Delta struct {
|
|||
Value float64
|
||||
Currency Currency
|
||||
Description string
|
||||
isSet bool
|
||||
}
|
||||
|
||||
func newDelta(d, desc, name string, v float64, c string) Delta {
|
||||
|
|
@ -36,5 +37,10 @@ func (delta Delta) Plus(other Delta) Delta {
|
|||
}
|
||||
|
||||
func (delta Delta) Debug() string {
|
||||
return fmt.Sprintf("{@%s %s:\"%s\" %.2f %s}", delta.Date, delta.Name, delta.Description, delta.Value, delta.Currency)
|
||||
return fmt.Sprintf("{@%s %s:\"%s\" %s%.2f %s}", delta.Date, delta.Name, delta.Description, func() string {
|
||||
if !delta.isSet {
|
||||
return ""
|
||||
}
|
||||
return "= "
|
||||
}(), delta.Value, delta.Currency)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ type transactionRecipient struct {
|
|||
name string
|
||||
value float64
|
||||
currency string
|
||||
isSet bool
|
||||
}
|
||||
|
||||
func (t transactionRecipient) empty() bool {
|
||||
|
|
@ -109,7 +110,7 @@ func _readTransaction(r *bufio.Reader) (transaction, error) {
|
|||
}
|
||||
|
||||
for {
|
||||
name, value, currency, err := readTransactionName(r)
|
||||
name, value, currency, isSet, err := readTransactionName(r)
|
||||
if name != "" {
|
||||
if currency == "" {
|
||||
result.payee = name
|
||||
|
|
@ -118,6 +119,7 @@ func _readTransaction(r *bufio.Reader) (transaction, error) {
|
|||
name: name,
|
||||
value: value,
|
||||
currency: currency,
|
||||
isSet: isSet,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -179,39 +181,43 @@ func _readTransactionLine(r *bufio.Reader) ([]byte, error) {
|
|||
return b2[:n], err
|
||||
}
|
||||
|
||||
func readTransactionName(r *bufio.Reader) (string, float64, string, error) {
|
||||
func readTransactionName(r *bufio.Reader) (string, float64, string, bool, error) {
|
||||
line, err := readTransactionLine(r)
|
||||
if err != nil {
|
||||
return "", 0, "", err
|
||||
return "", 0, "", false, err
|
||||
}
|
||||
|
||||
if len(line) > 0 && !unicode.IsSpace(rune(line[0])) {
|
||||
r2 := *r
|
||||
*r = *bufio.NewReader(io.MultiReader(bytes.NewReader(append(line, '\n')), &r2))
|
||||
return "", 0, "", nil
|
||||
return "", 0, "", false, nil
|
||||
}
|
||||
|
||||
fields := bytes.Fields(line)
|
||||
|
||||
isSet := false
|
||||
if len(fields) > 2 && string(fields[1]) == "=" {
|
||||
isSet = true
|
||||
fields = append(fields[:1], fields[2:]...)
|
||||
}
|
||||
|
||||
switch len(fields) {
|
||||
case 1: // payee
|
||||
return string(fields[0]), 0, "", nil
|
||||
case 2: // $00.00
|
||||
return string(fields[0]), 0, "", false, nil
|
||||
case 2: // payee $00.00
|
||||
b := bytes.TrimLeft(fields[1], "$")
|
||||
value, err := strconv.ParseFloat(string(b), 64)
|
||||
if err != nil {
|
||||
return "", 0, "", fmt.Errorf("failed to parse value from $XX.YY from %q (%q): %w", line, fields[1], err)
|
||||
return "", 0, "", isSet, fmt.Errorf("failed to parse value from $XX.YY from %q (%q): %w", line, fields[1], err)
|
||||
}
|
||||
return string(fields[0]), value, string(USD), nil
|
||||
case 3: // 00.00 XYZ
|
||||
return string(fields[0]), value, string(USD), isSet, nil
|
||||
case 3: // payee 00.00 XYZ
|
||||
value, err := strconv.ParseFloat(string(fields[1]), 64)
|
||||
if err != nil {
|
||||
return "", 0, "", fmt.Errorf("failed to parse value from XX.YY XYZ from %q (%q): %w", line, fields[1], err)
|
||||
return "", 0, "", false, fmt.Errorf("failed to parse value from XX.YY XYZ from %q (%q): %w", line, fields[1], err)
|
||||
}
|
||||
return string(fields[0]), value, string(fields[2]), nil
|
||||
case 4: // = ($00.00 OR 00.00 XYZ)
|
||||
//return "", 0, "", fmt.Errorf("not impl: %q", line)
|
||||
return string(fields[0]), 0.01, string(USD), nil
|
||||
return string(fields[0]), value, string(fields[2]), isSet, nil
|
||||
default:
|
||||
return "", 0, "", fmt.Errorf("cannot interpret %q", line)
|
||||
return "", 0, "", isSet, fmt.Errorf("cannot interpret %q", line)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue