Skip to main content

use_stoichiometry/
limiting_reagent.rs

1use std::fmt;
2
3use crate::StoichiometryValidationError;
4
5/// A validated limiting-reagent label.
6#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
7pub struct LimitingReagent(String);
8
9impl LimitingReagent {
10    /// Creates a limiting-reagent label.
11    ///
12    /// # Errors
13    ///
14    /// Returns [`StoichiometryValidationError::EmptyLimitingReagentLabel`] when `label`
15    /// is empty or whitespace only.
16    pub fn new(label: &str) -> Result<Self, StoichiometryValidationError> {
17        let label = label.trim();
18
19        if label.is_empty() {
20            Err(StoichiometryValidationError::EmptyLimitingReagentLabel)
21        } else {
22            Ok(Self(label.to_owned()))
23        }
24    }
25
26    /// Returns the label text.
27    #[must_use]
28    pub fn as_str(&self) -> &str {
29        &self.0
30    }
31
32    /// Consumes the label and returns the owned text.
33    #[must_use]
34    pub fn into_string(self) -> String {
35        self.0
36    }
37}
38
39impl AsRef<str> for LimitingReagent {
40    fn as_ref(&self) -> &str {
41        self.as_str()
42    }
43}
44
45impl TryFrom<&str> for LimitingReagent {
46    type Error = StoichiometryValidationError;
47
48    fn try_from(value: &str) -> Result<Self, Self::Error> {
49        Self::new(value)
50    }
51}
52
53impl fmt::Display for LimitingReagent {
54    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
55        formatter.write_str(self.as_str())
56    }
57}