use super::{HostRef, ServiceCheckRef};
use crate::{prelude::*, util::*};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub struct Plugin {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub envvars: Option<String>,
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_string_or_number_to_u64",
default
)]
pub origin_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hostcheckcommands: Option<ConfigRefMap<HostRef>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub servicechecks: Option<ConfigRefMap<ServiceCheckRef>>,
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_string_or_number_to_option_bool",
serialize_with = "serialize_option_bool_as_string",
default
)]
pub uncommitted: Option<bool>,
}
impl CreateFromJson for Plugin {}
impl ConfigObject for Plugin {
type Builder = PluginBuilder;
fn builder() -> Self::Builder {
PluginBuilder::new()
}
fn config_path() -> Option<String> {
Some("/config/plugin".to_string())
}
fn unique_name(&self) -> String {
self.name.clone()
}
}
#[derive(Clone, Debug, Default)]
pub struct PluginBuilder {
name: Option<String>,
envvars: Option<String>,
origin_id: Option<u64>,
}
impl Builder for PluginBuilder {
type ConfigObject = Plugin;
fn new() -> Self {
PluginBuilder::default()
}
fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
fn build(self) -> Result<Self::ConfigObject, OpsviewConfigError> {
let name = require_field(&self.name, "name")?;
if self.origin_id.is_some() && self.origin_id.unwrap() > 1 {
return Err(OpsviewConfigError::InvalidPluginOriginID);
}
Ok(Plugin {
name,
envvars: self.envvars,
origin_id: self.origin_id,
hostcheckcommands: None,
servicechecks: None,
uncommitted: None,
})
}
}
impl PluginBuilder {
pub fn clear_envvars(mut self) -> Self {
self.envvars = None;
self
}
pub fn clear_name(mut self) -> Self {
self.name = None;
self
}
pub fn clear_origin_id(mut self) -> Self {
self.origin_id = None;
self
}
pub fn built_in(mut self, built_in: bool) -> Self {
self.origin_id = Some(if built_in { 0 } else { 1 });
self
}
pub fn envvars(mut self, envvars: &str) -> Self {
self.envvars = Some(envvars.to_string());
self
}
pub fn origin_id(mut self, origin_id: u64) -> Self {
self.origin_id = Some(origin_id);
self
}
pub fn user_uploaded(mut self, user_uploaded: bool) -> Self {
self.origin_id = Some(if user_uploaded { 1 } else { 0 });
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default() {
let plugin = Plugin::default();
assert_eq!(plugin.name, "".to_string());
}
#[test]
fn test_minimal() {
let plugin = Plugin::minimal("My Plugin");
assert_eq!(plugin.unwrap().name, "My Plugin".to_string());
}
}