vesys-bank-server/socket-server/src/protocol.rs

82 lines
2.2 KiB
Rust

use anyhow::Result;
use bank::account::{Account, AccountError};
use crate::commands::error::SocketAccountError;
pub const START: [u8; 2] = [0xde, 0xad];
pub const PONG: u8 = 0b0010_0000;
pub fn account_nr(nr: &str) -> Vec<u8> {
let mut response = vec![PONG];
response.append(&mut nr.as_bytes().to_vec());
debug!("account number bytes: {:?}", response);
response
}
pub fn account_passivate(was_passivated: bool) -> Vec<u8> {
let is_active_byte: u8 = if was_passivated { 1 } else { 0 };
vec![PONG | is_active_byte]
}
pub fn deposit(result: Result<f64, AccountError>) -> Vec<u8> {
match result {
Err(e) => error(SocketAccountError(e).into()).to_vec(),
Ok(_) => vec![PONG],
}
}
pub fn withdraw(result: Result<f64, AccountError>) -> Vec<u8> {
match result {
Err(e) => error(SocketAccountError(e).into()).to_vec(),
Ok(_) => vec![PONG],
}
}
pub fn account_nrs(nrs: &[String]) -> Vec<u8> {
let mut response = vec![PONG];
nrs.iter().for_each(|key| {
let key_bytes = key.as_bytes();
debug!("account number bytes: {:?}", key_bytes);
response.push(key_bytes.len() as u8);
response.append(&mut key_bytes.to_vec());
});
debug!("account numbers bytes: {:?}", response);
response
}
pub fn account(account: &Account) -> Vec<u8> {
let is_active_byte: u8 = if account.is_active { 1 } else { 0 };
let mut response = vec![PONG | is_active_byte];
let nr_bytes = account.number.as_bytes();
let mut nr_bytes_sized = vec![nr_bytes.len() as u8];
nr_bytes_sized.append(&mut nr_bytes.to_vec());
debug!("nr bytes: {:?}", nr_bytes_sized);
let owner_bytes = account.owner.as_bytes();
let mut owner_bytes_sized = vec![owner_bytes.len() as u8];
owner_bytes_sized.append(&mut owner_bytes.to_vec());
debug!("owner bytes: {:?}", owner_bytes_sized);
let balance: [u8; 8] = account.balance.to_be_bytes();
debug!("balance bytes: {:?}", balance);
response.append(&mut nr_bytes_sized);
response.append(&mut owner_bytes_sized);
response.append(&mut balance.to_vec());
debug!("account response: {:?}", response);
response
}
pub fn error(code: u8) -> [u8; 1] {
[0b0100_0000 | code]
}