Skip to main content

deepwoken_reqparse/model/
reqfile.rs

1use std::str::FromStr;
2
3use serde::{Deserialize, Deserializer, Serialize, de};
4
5use crate::{model::opt::OptionalGroup, req::Requirement};
6
7/// The parsed representation of a reqfile
8#[derive(Debug)]
9pub struct Reqfile {
10    pub general: Vec<Requirement>,
11    pub post: Vec<Requirement>,
12
13    pub optional: Vec<OptionalGroup>
14}
15
16impl Reqfile {
17    /// Retrieve an iterator containing the required requirements
18    pub fn req_iter(&self) -> impl Iterator<Item = &Requirement> {
19        self.general.iter().chain(self.post.iter())
20    }
21}
22
23impl FromStr for Reqfile {
24    type Err = String;
25
26    fn from_str(s: &str) -> Result<Self, Self::Err> {
27        crate::parse::reqfile::parse_reqfile_str(s)
28            .map_err(|e| format!("Failed to parse requirement: {}", e))
29    }
30}
31
32impl<'de> Deserialize<'de> for Reqfile {
33    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
34    where
35        D: Deserializer<'de>,
36    {
37        let s = String::deserialize(deserializer)?;
38        s.parse().map_err(de::Error::custom)
39    }
40}