Skip to main content

braid_types/
cam_num.rs

1// Copyright (C) The Strand-Braid Authors
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4/// Camera number identifier.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct CamNum(pub u8);
7
8impl std::fmt::Display for CamNum {
9    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
10        std::fmt::Display::fmt(&self.0, fmt)
11    }
12}
13
14impl From<u8> for CamNum {
15    fn from(val: u8) -> CamNum {
16        CamNum(val)
17    }
18}
19
20// ---------------------------------------------------------------------------
21// serde helpers for `CamNum`, which is represented as u8.
22
23impl serde::Serialize for CamNum {
24    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
25    where
26        S: serde::Serializer,
27    {
28        serializer.serialize_u8(self.0)
29    }
30}
31
32impl<'de> serde::Deserialize<'de> for CamNum {
33    fn deserialize<D>(deserializer: D) -> std::result::Result<CamNum, D::Error>
34    where
35        D: serde::Deserializer<'de>,
36    {
37        let val: u8 = deserializer.deserialize_u8(CamNumVisitor)?;
38        Ok(CamNum(val))
39    }
40}
41
42struct CamNumVisitor;
43
44impl serde::de::Visitor<'_> for CamNumVisitor {
45    type Value = u8;
46
47    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
48        formatter.write_str("an unsigned 8-bit integer")
49    }
50
51    fn visit_u8<E>(self, value: u8) -> std::result::Result<Self::Value, E>
52    where
53        E: serde::de::Error,
54    {
55        Ok(value)
56    }
57}