| 1 | module big |
| 2 | |
| 3 | // from_json_number implements a custom decoder for json2 |
| 4 | pub fn (mut result Integer) from_json_number(raw_number string) ! { |
| 5 | mut index := 0 |
| 6 | mut is_negative := false |
| 7 | |
| 8 | if raw_number[0] == `-` { |
| 9 | is_negative = true |
| 10 | index++ |
| 11 | } |
| 12 | |
| 13 | ten := integer_from_int(10) |
| 14 | |
| 15 | for index < raw_number.len { |
| 16 | digit := raw_number[index] - `0` |
| 17 | |
| 18 | if digit > 9 { // comma, e and E are all smaller 0 in ASCII so they underflow |
| 19 | return error('expected integer but got real number') |
| 20 | } |
| 21 | |
| 22 | result = (result * ten) + integer_from_int(int(digit)) |
| 23 | |
| 24 | index++ |
| 25 | } |
| 26 | |
| 27 | if is_negative { |
| 28 | result = result * integer_from_int(-1) |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | // to_json implements a custom encoder for json2 |
| 33 | pub fn (result Integer) to_json() string { |
| 34 | return result.str() |
| 35 | } |
| 36 | |