sbatch_rs/sbatch_option/
validate.rs

1use super::{SbatchOption, SbatchOptionError};
2
3// Helper function to validate a string.
4// This function checks if the string is empty or contains leading or trailing spaces.
5fn validate_str(s: &str) -> Result<(), SbatchOptionError> {
6    if s.trim().is_empty() {
7        Err(SbatchOptionError::EmptyString)
8    } else if s != s.trim() {
9        Err(SbatchOptionError::LeadingOrTrailingSpaces)
10    } else {
11        Ok(())
12    }
13}
14
15impl SbatchOption {
16    /// Validates the sbatch option.
17    ///
18    /// # Returns
19    ///
20    /// This function returns `Ok(())` if the sbatch option is valid, otherwise it returns a `SbatchOptionError`.
21    ///
22    /// # Errors
23    ///
24    /// This function returns a `SbatchOptionError` if the sbatch option is invalid.
25    /// The following are considered invalid:
26    /// - An empty string
27    /// - A string that contains leading or trailing spaces
28    ///
29    /// # Examples
30    ///
31    /// ```
32    /// use sbatch_rs::SbatchOption;
33    ///
34    /// // Valid: mapped to `--account=account`
35    /// let sbatch_option = SbatchOption::Account("account".to_string());
36    /// assert!(sbatch_option.validate().is_ok());
37    ///
38    /// // Invalid: empty string
39    /// let sbatch_option = SbatchOption::Account("".to_string());
40    /// assert!(sbatch_option.validate().is_err());
41    ///
42    /// // Invalid: leading or trailing spaces
43    /// let sbatch_option = SbatchOption::Account(" account ".to_string());
44    /// assert!(sbatch_option.validate().is_err());
45    /// ```
46    pub fn validate(&self) -> Result<(), SbatchOptionError> {
47        match self {
48            SbatchOption::Account(value) => validate_str(value),
49            SbatchOption::AcctgFreq(value) => validate_str(value),
50            SbatchOption::Array(value) => validate_str(value),
51            SbatchOption::Batch(value) => validate_str(value),
52            SbatchOption::Bb(value) => validate_str(value),
53            SbatchOption::Bbf(value) => validate_str(value),
54            SbatchOption::Begin(value) => validate_str(value),
55            SbatchOption::Chdir(value) => validate_str(value),
56            SbatchOption::ClusterConstraint(value) => validate_str(value),
57            SbatchOption::Clusters(value) => validate_str(value),
58            SbatchOption::Comment(value) => validate_str(value),
59            SbatchOption::Constraint(value) => validate_str(value),
60            SbatchOption::Container(value) => validate_str(value),
61            SbatchOption::ContainerID(value) => validate_str(value),
62            SbatchOption::Contiguous => Ok(()),
63            SbatchOption::CoreSpec(value) => validate_str(value),
64            SbatchOption::CoresPerSocket(value) => validate_str(value),
65            SbatchOption::CPUFreq(value) => validate_str(value),
66            SbatchOption::CPUsPerGPU(value) => validate_str(value),
67            SbatchOption::CPUsPerTask(value) => validate_str(value),
68            SbatchOption::Deadline(value) => validate_str(value),
69            SbatchOption::DelayBoot(value) => validate_str(value),
70            SbatchOption::Dependency(value) => validate_str(value),
71            SbatchOption::Distribution(value) => validate_str(value),
72            SbatchOption::Error(value) => validate_str(value),
73            SbatchOption::Exclude(value) => validate_str(value),
74            SbatchOption::Exclusive(Some(value)) => validate_str(value),
75            SbatchOption::Exclusive(None) => Ok(()),
76            SbatchOption::Export(value) => validate_str(value),
77            SbatchOption::ExportFile(value) => validate_str(value),
78            SbatchOption::Extra(value) => validate_str(value),
79            SbatchOption::ExtraNodeInfo(value) => validate_str(value),
80            SbatchOption::GetUserEnv(Some(value)) => validate_str(value),
81            SbatchOption::GetUserEnv(None) => Ok(()),
82            SbatchOption::GID(value) => validate_str(value),
83            SbatchOption::GPUBind(value) => validate_str(value),
84            SbatchOption::GPUFreq(value) => validate_str(value),
85            SbatchOption::GPUs(value) => validate_str(value),
86            SbatchOption::GPUsPerNode(value) => validate_str(value),
87            SbatchOption::GPUsPerSocket(value) => validate_str(value),
88            SbatchOption::GPUsPerTask(value) => validate_str(value),
89            SbatchOption::Gres(value) => validate_str(value),
90            SbatchOption::GresFlags(value) => validate_str(value),
91            SbatchOption::Help => Ok(()),
92            SbatchOption::Hint(value) => validate_str(value),
93            SbatchOption::Hold => Ok(()),
94            SbatchOption::IgnorePbs => Ok(()),
95            SbatchOption::Input(value) => validate_str(value),
96            SbatchOption::JobName(value) => validate_str(value),
97            SbatchOption::KillOnInvalidDep(value) => validate_str(value),
98            SbatchOption::Licenses(value) => validate_str(value),
99            SbatchOption::MailType(value) => validate_str(value),
100            SbatchOption::MailUser(value) => validate_str(value),
101            SbatchOption::McsLabel(value) => validate_str(value),
102            SbatchOption::Mem(value) => validate_str(value),
103            SbatchOption::MemBind(value) => validate_str(value),
104            SbatchOption::MemPerCPU(value) => validate_str(value),
105            SbatchOption::MemPerGPU(value) => validate_str(value),
106            SbatchOption::MinCPUs(value) => validate_str(value),
107            SbatchOption::Network(value) => validate_str(value),
108            SbatchOption::Nice(Some(value)) => validate_str(value),
109            SbatchOption::Nice(None) => Ok(()),
110            SbatchOption::NoKill(Some(value)) => validate_str(value),
111            SbatchOption::NoKill(None) => Ok(()),
112            SbatchOption::NoRequeue => Ok(()),
113            SbatchOption::NodeFile(value) => validate_str(value),
114            SbatchOption::NodeList(value) => validate_str(value),
115            SbatchOption::Nodes(value) => validate_str(value),
116            SbatchOption::NTasks(value) => validate_str(value),
117            SbatchOption::NTasksPerCore(value) => validate_str(value),
118            SbatchOption::NTasksPerGPU(value) => validate_str(value),
119            SbatchOption::NTasksPerNode(value) => validate_str(value),
120            SbatchOption::NTasksPerSocket(value) => validate_str(value),
121            SbatchOption::OOMKillStep(Some(value)) => validate_str(value),
122            SbatchOption::OOMKillStep(None) => Ok(()),
123            SbatchOption::OpenMode(value) => validate_str(value),
124            SbatchOption::Output(value) => validate_str(value),
125            SbatchOption::Overcommit => Ok(()),
126            SbatchOption::Oversubscribe => Ok(()),
127            SbatchOption::Parsable => Ok(()),
128            SbatchOption::Partition(value) => validate_str(value),
129            SbatchOption::Prefer(value) => validate_str(value),
130            SbatchOption::Priority(value) => validate_str(value),
131            SbatchOption::Profile(value) => validate_str(value),
132            SbatchOption::Propagate(Some(value)) => validate_str(value),
133            SbatchOption::Propagate(None) => Ok(()),
134            SbatchOption::Qos(value) => validate_str(value),
135            SbatchOption::Quiet => Ok(()),
136            SbatchOption::Reboot => Ok(()),
137            SbatchOption::Requeue => Ok(()),
138            SbatchOption::Reservation(value) => validate_str(value),
139            SbatchOption::ResvPorts(Some(value)) => validate_str(value),
140            SbatchOption::ResvPorts(None) => Ok(()),
141            SbatchOption::Segment(value) => validate_str(value),
142            SbatchOption::Signal(value) => validate_str(value),
143            SbatchOption::SocketsPerNode(value) => validate_str(value),
144            SbatchOption::SpreadJob => Ok(()),
145            SbatchOption::Stepmgr => Ok(()),
146            SbatchOption::Switches(value) => validate_str(value),
147            SbatchOption::TestOnly => Ok(()),
148            SbatchOption::ThreadSpec(value) => validate_str(value),
149            SbatchOption::ThreadsPerCore(value) => validate_str(value),
150            SbatchOption::Time(value) => validate_str(value),
151            SbatchOption::TimeMin(value) => validate_str(value),
152            SbatchOption::Tmp(value) => validate_str(value),
153            SbatchOption::TresBind(value) => validate_str(value),
154            SbatchOption::TresPerTask(value) => validate_str(value),
155            SbatchOption::UID(value) => validate_str(value),
156            SbatchOption::Usage => Ok(()),
157            SbatchOption::UseMinNodes => Ok(()),
158            SbatchOption::Verbose => Ok(()),
159            SbatchOption::Version => Ok(()),
160            SbatchOption::Wait => Ok(()),
161            SbatchOption::WaitAllNodes(value) => validate_str(value),
162            SbatchOption::WCKey(value) => validate_str(value),
163            SbatchOption::Wrap(_) => Ok(()), // Allow --wrap="" to be empty
164        }
165    }
166}