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 super::{AccountLoginResponse, AccountsViewResponse};
|
||||||
|
use crate::storage::{ParseError, TokenParser, TokenSerializable, TokenWriter};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub enum AccountsRouteResponse {
|
pub enum AccountsRouteResponse {
|
||||||
@@ -11,3 +12,77 @@ pub enum AccountsRoute {
|
|||||||
Accounts,
|
Accounts,
|
||||||
AddAccount,
|
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