1mod context;
2mod server_impl;
3mod session;
4mod util;
5
6pub use server_impl::*;
7
8use crate::SecurityAlgo;
9use iso14229_1::{
10 response::SessionTiming, utils::did_config_deserialize, DataIdentifier, DidConfig,
11};
12use iso15765_2::can::Address;
13use rsutil::types::ByteOrder;
14use serde::{Deserialize, Deserializer};
15use std::collections::HashMap;
16
17pub type DidSaLevel = HashMap<DataIdentifier, u8>;
18
19fn did_sa_level_deserialize<'de, D>(deserializer: D) -> Result<DidSaLevel, D::Error>
20where
21 D: Deserializer<'de>,
22{
23 let raw_map: HashMap<u16, u8> = HashMap::deserialize(deserializer)?;
24
25 let res = raw_map
26 .into_iter()
27 .map(|(k, v)| (DataIdentifier::from(k), v))
28 .collect::<HashMap<_, _>>();
29
30 Ok(res)
31}
32
33#[allow(unused)]
34#[derive(Debug, Clone, Deserialize)]
35pub struct Config {
36 pub(crate) address: Address,
37 pub(crate) timing: SessionTiming,
38 pub(crate) extend_sa_level: u8,
40 pub(crate) program_sa_level: u8,
42 pub(crate) seed_len: usize,
43 pub(crate) sa_salt: Vec<u8>,
44 #[serde(deserialize_with = "did_config_deserialize")]
45 pub(crate) did_cfg: DidConfig,
46 #[serde(deserialize_with = "did_sa_level_deserialize")]
47 pub(crate) did_sa_level: DidSaLevel,
48 pub(crate) byte_order: ByteOrder,
49}
50
51#[async_trait::async_trait]
52pub trait Server {
53 async fn update_address(&self, address: Address);
54 async fn update_security_algo(&self, algo: SecurityAlgo);
55 async fn service_forever(&mut self, interval_us: u64);
56
57 async fn service_stop(&mut self);
58}