tokens: add AccountsRoute token serializer
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -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<Self, ParseError<'a>> {
|
||||
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<AccountsRoute, ParseError<'a>> {
|
||||
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::<Vec<&str>>();
|
||||
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::<Vec<&str>>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user