From 19f0b0365bbb58e702a7fca9fd351036e57a88a1 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Mon, 4 Nov 2024 01:20:35 -0500 Subject: [PATCH] Move error lookup function --- src/lenient_parse/internal/parse.gleam | 16 ++-------------- src/lenient_parse/internal/tokenizer.gleam | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/lenient_parse/internal/parse.gleam b/src/lenient_parse/internal/parse.gleam index 9f20099..b20a3e2 100644 --- a/src/lenient_parse/internal/parse.gleam +++ b/src/lenient_parse/internal/parse.gleam @@ -35,7 +35,7 @@ pub fn parse_float(input: String) -> Result(String, ParseError) { use #(_, tokens, index) <- result.try(post_whitespace_result) case tokens |> list.first { - Ok(token) -> Error(extraneous_token_error(token, index)) + Ok(token) -> Error(tokenizer.error_for_token(token, index)) _ -> { case digit_pre_decimal, digit_post_decimal { Some(pre), Some(post) -> Ok(sign <> pre <> "." <> post) @@ -75,7 +75,7 @@ pub fn parse_int(input: String) -> Result(String, ParseError) { use #(_, tokens, index) <- result.try(post_whitespace_result) case tokens |> list.first { - Ok(token) -> Error(extraneous_token_error(token, index)) + Ok(token) -> Error(tokenizer.error_for_token(token, index)) _ -> { case leading_whitespace, digit { Some(_), Some(digit) | None, Some(digit) -> Ok(sign <> digit) @@ -191,15 +191,3 @@ fn parse_digit( } } } - -// TODO: Move this to some place that makes more sense -fn extraneous_token_error(token: Token, index) -> ParseError { - case token { - Digit(digit) -> InvalidDigitPosition(digit, index) - Sign(sign) -> InvalidSignPosition(sign, index) - Underscore -> InvalidUnderscorePosition(index) - Unknown(character) -> UnknownCharacter(character, index) - Whitespace(whitespace) -> UnknownCharacter(whitespace, index) - DecimalPoint -> InvalidDecimalPosition(index) - } -} diff --git a/src/lenient_parse/internal/tokenizer.gleam b/src/lenient_parse/internal/tokenizer.gleam index 4214d15..04bb646 100644 --- a/src/lenient_parse/internal/tokenizer.gleam +++ b/src/lenient_parse/internal/tokenizer.gleam @@ -1,5 +1,9 @@ import gleam/list import gleam/string +import parse_error.{ + type ParseError, InvalidDecimalPosition, InvalidDigitPosition, + InvalidSignPosition, InvalidUnderscorePosition, UnknownCharacter, +} pub type Token { Sign(String) @@ -32,3 +36,14 @@ fn do_tokenize(characters: List(String), acc: List(Token)) -> List(Token) { } } } + +pub fn error_for_token(token: Token, index) -> ParseError { + case token { + Digit(digit) -> InvalidDigitPosition(digit, index) + Sign(sign) -> InvalidSignPosition(sign, index) + Underscore -> InvalidUnderscorePosition(index) + Unknown(character) -> UnknownCharacter(character, index) + Whitespace(whitespace) -> UnknownCharacter(whitespace, index) + DecimalPoint -> InvalidDecimalPosition(index) + } +}