docan_rs/server/
mod.rs

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    /// extend session security access level
38    pub(crate) extend_sa_level: u8,
39    /// program session security access level
40    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}