From 6b57401e147bfb33c5a9533a5a155d6379ab3f95 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 21 Jan 2025 13:10:43 -0800 Subject: [PATCH] tokens: add AccountsRoute token serializer Signed-off-by: William Casarin --- crates/notedeck_columns/src/accounts/route.rs | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/crates/notedeck_columns/src/accounts/route.rs b/crates/notedeck_columns/src/accounts/route.rs index 69ce1279..6447fffe 100644 --- a/crates/notedeck_columns/src/accounts/route.rs +++ b/crates/notedeck_columns/src/accounts/route.rs @@ -1,4 +1,5 @@ use super::{AccountLoginResponse, AccountsViewResponse}; +use crate::storage::{ParseError, TokenParser, TokenSerializable, TokenWriter}; use serde::{Deserialize, Serialize}; pub enum AccountsRouteResponse { @@ -11,3 +12,77 @@ pub enum AccountsRoute { Accounts, AddAccount, } + +impl AccountsRoute { + /// Route tokens use in both serialization and deserialization + fn tokens(&self) -> &'static [&'static str] { + match self { + Self::Accounts => &["accounts", "show"], + Self::AddAccount => &["accounts", "new"], + } + } +} + +impl TokenSerializable for AccountsRoute { + fn serialize_tokens(&self, writer: &mut TokenWriter) { + for token in self.tokens() { + writer.write_token(token); + } + } + + fn parse_from_tokens<'a>(parser: &mut TokenParser<'a>) -> Result> { + parser.peek_parse_token("accounts")?; + + TokenParser::alt( + parser, + &[ + |p| parse_accounts_route(p, AccountsRoute::Accounts), + |p| parse_accounts_route(p, AccountsRoute::AddAccount), + ], + ) + } +} + +fn parse_accounts_route<'a>( + parser: &mut TokenParser<'a>, + route: AccountsRoute, +) -> Result> { + parser.parse_all(|p| { + for token in route.tokens() { + p.parse_token(token)?; + } + Ok(route) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::storage::{TokenParser, TokenSerializable, TokenWriter}; + + #[test] + fn test_accounts_route_serialize() { + let data_str = "accounts:show"; + let data = &data_str.split(":").collect::>(); + let mut token_writer = TokenWriter::default(); + let mut parser = TokenParser::new(&data); + let parsed = AccountsRoute::parse_from_tokens(&mut parser).unwrap(); + let expected = AccountsRoute::Accounts; + parsed.serialize_tokens(&mut token_writer); + assert_eq!(expected, parsed); + assert_eq!(token_writer.str(), data_str); + } + + #[test] + fn test_new_accounts_route_serialize() { + let data_str = "accounts:new"; + let data = &data_str.split(":").collect::>(); + let mut token_writer = TokenWriter::default(); + let mut parser = TokenParser::new(data); + let parsed = AccountsRoute::parse_from_tokens(&mut parser).unwrap(); + let expected = AccountsRoute::AddAccount; + parsed.serialize_tokens(&mut token_writer); + assert_eq!(expected, parsed); + assert_eq!(token_writer.str(), data_str); + } +}