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#[allow(unused)]
34#[derive(Debug, Clone, Deserialize)]
35pub struct Config {
36    pub(crate) address: Address,
37    pub(crate) timing: SessionTiming,
38    /// extend session security access level
39    pub(crate) extend_sa_level: u8,
40    /// program session security access level
41    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}