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#[derive(Debug, Clone, Deserialize)]
34pub struct Config {
35 pub(crate) address: Address,
36 pub(crate) timing: SessionTiming,
37 pub(crate) extend_sa_level: u8,
39 pub(crate) program_sa_level: u8,
41 pub(crate) seed_len: usize,
42 pub(crate) sa_salt: Vec<u8>,
43 #[serde(deserialize_with = "did_config_deserialize")]
44 pub(crate) did_cfg: DidConfig,
45 #[serde(deserialize_with = "did_sa_level_deserialize")]
46 pub(crate) did_sa_level: DidSaLevel,
47 pub(crate) byte_order: ByteOrder,
48}
49
50#[async_trait::async_trait]
51pub trait Server {
52 async fn update_address(&self, address: Address);
53 async fn update_security_algo(&self, algo: SecurityAlgo);
54 async fn service_forever(&mut self, interval_us: u64);
55
56 async fn service_stop(&mut self);
57}