1
use std::{fmt::Display, str::FromStr};
2

            
3
use serde::{Deserialize, Serialize};
4

            
5
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6
pub struct Audio {
7
    pub sample_rate: u64,
8
    pub bits: u8,
9
    pub channels: u8,
10
}
11

            
12
impl FromStr for Audio {
13
    type Err = ();
14

            
15
1
    fn from_str(s: &str) -> Result<Self, Self::Err> {
16
1
        let mut parts = s.split(':');
17
1
        let sample_rate = parts.next().ok_or(())?.parse().map_err(|_| ())?;
18
1
        let bits = u8::from_str_radix(parts.next().ok_or(())?, 16).map_err(|_| ())? + 1;
19
1
        let channels = parts.next().ok_or(())?.parse().map_err(|_| ())?;
20
1
        Ok(Self {
21
1
            sample_rate,
22
1
            bits,
23
1
            channels,
24
1
        })
25
1
    }
26
}
27

            
28
impl Display for Audio {
29
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30
        write!(
31
            f,
32
            "{}:{:X}:{}",
33
            self.sample_rate,
34
            self.bits - 1,
35
            self.channels
36
        )
37
    }
38
}