#![allow(non_snake_case)]
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct Options {
pub url: std::option::Option<String>,
pub hide_tip: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OpenApiOption {
Url(String),
HideTip,
}
pub type Option = OpenApiOption;
impl Options {
pub fn apply(&mut self, option: OpenApiOption) {
match option {
OpenApiOption::Url(url) => self.url = Some(url),
OpenApiOption::HideTip => self.hide_tip = true,
}
}
pub fn from_options<I, O>(options: I) -> Self
where
I: IntoIterator<Item = O>,
O: Into<OpenApiOption>,
{
options
.into_iter()
.fold(Self::default(), |mut opts, option| {
opts.apply(option.into());
opts
})
}
}
impl From<&OpenApiOption> for OpenApiOption {
fn from(option: &OpenApiOption) -> Self {
option.clone()
}
}
pub fn WithURL(url: impl Into<String>) -> OpenApiOption {
OpenApiOption::Url(url.into())
}
pub fn WithHideTip() -> OpenApiOption {
OpenApiOption::HideTip
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn options_match_botgo_builders() {
let opts = Options::from_options([WithURL("https://example.com"), WithHideTip()]);
assert_eq!(opts.url.as_deref(), Some("https://example.com"));
assert!(opts.hide_tip);
}
}