diff --git a/src/store/mod.rs b/src/store/mod.rs index e6537b7..9498aef 100644 --- a/src/store/mod.rs +++ b/src/store/mod.rs @@ -2,8 +2,46 @@ mod id_mapping; pub mod persistence; mod id_store; +use heapless::String; pub use id_mapping::{IDMapping, Name}; pub use id_store::{IDStore,AttendanceDay}; pub type TallyID = [u8; 6]; pub type Date = [u8; 10]; + +pub fn hex_string_to_tally_id(s: &str) -> Option { + let bytes = s.as_bytes(); + if bytes.len() != 12 { + return None; + } + + let mut out: TallyID = [0;6]; + for i in 0..6 { + let hi = hex_val(bytes[2 * i])?; + let lo = hex_val(bytes[2 * i + 1])?; + out[i] = (hi << 4) | lo; + } + Some(out) +} + +pub fn tally_id_to_hex_string(bytes: TallyID) -> Option> { + const HEX_CHARS: &[u8; 16] = b"0123456789abcdef"; + let mut s: String<12> = String::new(); + + for &b in &bytes { + s.push(HEX_CHARS[(b >> 4) as usize] as char).ok()?; + s.push(HEX_CHARS[(b & 0x0F) as usize] as char).ok()?; + } + + Some(s) +} + +fn hex_val(b: u8) -> Option { + match b { + b'0'..=b'9' => Some(b - b'0'), + b'a'..=b'f' => Some(b - b'a' + 10), + b'A'..=b'F' => Some(b - b'A' + 10), + _ => None, + } +} + diff --git a/src/webserver/api.rs b/src/webserver/api.rs index 3afd134..ae11e18 100644 --- a/src/webserver/api.rs +++ b/src/webserver/api.rs @@ -6,8 +6,8 @@ use picoserve::{ use serde::Deserialize; use crate::{ - store::{Name, TallyID}, - webserver::app::AppState, + store::{Name, hex_string_to_tally_id}, + webserver::{app::AppState, sse::IDEvents}, }; #[derive(Deserialize)] @@ -16,30 +16,6 @@ pub struct NewMapping { name: Name, } -pub fn hex_string_to_tally_id(s: &str) -> Option { - let bytes = s.as_bytes(); - if bytes.len() != 24 { - return None; - } - - let mut out = [0u8; 12]; - for i in 0..12 { - let hi = hex_val(bytes[2 * i])?; - let lo = hex_val(bytes[2 * i + 1])?; - out[i] = (hi << 4) | lo; - } - Some(out) -} - -fn hex_val(b: u8) -> Option { - match b { - b'0'..=b'9' => Some(b - b'0'), - b'a'..=b'f' => Some(b - b'a' + 10), - b'A'..=b'F' => Some(b - b'A' + 10), - _ => None, - } -} - /* * #[get("/api/idevent")] * #[get("/api/csv")]