1use crate::{MyError, MyVersion, data::Extensions};
4use core::fmt;
5use serde::{Deserialize, Serialize};
6use serde_with::skip_serializing_none;
7use std::str::FromStr;
8
9#[derive(Debug, Deserialize, PartialEq, Serialize)]
12#[skip_serializing_none]
13pub struct About {
14 #[serde(rename = "version")]
19 versions: Vec<String>,
20 extensions: Option<Extensions>,
21}
22
23impl About {
24 pub fn new(versions: Vec<MyVersion>, extensions: Extensions) -> Self {
26 let versions = versions.iter().map(|x| x.to_string()).collect();
27 let extensions = if extensions.is_empty() {
28 None
29 } else {
30 Some(extensions)
31 };
32 About {
33 versions,
34 extensions,
35 }
36 }
37
38 pub fn versions(&self) -> Result<Vec<MyVersion>, MyError> {
40 let mut vec = vec![];
41 for x in self.versions.iter() {
42 vec.push(MyVersion::from_str(x)?);
43 }
44 Ok(vec)
45 }
46
47 pub fn extensions(&self) -> Option<&Extensions> {
49 self.extensions.as_ref()
50 }
51}
52
53impl fmt::Display for About {
54 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55 let mut vec = vec![];
56 vec.push(format!(
57 "versions: [{}]",
58 &self
59 .versions
60 .iter()
61 .map(|x| x.to_string())
62 .collect::<Vec<_>>()
63 .join(", ")
64 ));
65 if self.extensions.is_some() {
66 vec.push(format!("extensions: {}", self.extensions.as_ref().unwrap()))
67 }
68 let res = vec
69 .iter()
70 .map(|x| x.to_string())
71 .collect::<Vec<_>>()
72 .join(", ");
73 write!(f, "About{{ {res} }}")
74 }
75}