use serde::{Deserialize, Serialize};
#[cfg(doc)]
use super::ProcessInfo;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
#[non_exhaustive]
pub enum DogSource {
BuiltIn,
Adopted {
path: String,
#[serde(default, skip_serializing_if = "core::ops::Not::not")]
channel: bool,
},
}
impl DogSource {
const fn as_str(&self) -> &'static str {
match self {
DogSource::BuiltIn => "built-in",
DogSource::Adopted { .. } => "adopted",
}
}
}
impl From<&DogSource> for &'static str {
fn from(source: &DogSource) -> Self {
source.as_str()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_dog_source_serializes_snake_case_under_its_kind() {
assert_eq!(
serde_json::to_string(&DogSource::BuiltIn).unwrap(),
r#"{"kind":"built_in"}"#
);
let adopted = DogSource::Adopted {
path: "/usr/local/bin/shep-otel".to_string(),
channel: false,
};
let wire = r#"{"kind":"adopted","path":"/usr/local/bin/shep-otel"}"#;
assert_eq!(serde_json::to_string(&adopted).unwrap(), wire);
assert_eq!(serde_json::from_str::<DogSource>(wire).unwrap(), adopted);
}
#[test]
fn an_adopted_dog_that_asked_for_the_channel_says_so_on_the_wire() {
let adopted = DogSource::Adopted {
path: "/usr/local/bin/shep-otel".to_string(),
channel: true,
};
let wire = r#"{"kind":"adopted","path":"/usr/local/bin/shep-otel","channel":true}"#;
assert_eq!(serde_json::to_string(&adopted).unwrap(), wire);
assert_eq!(serde_json::from_str::<DogSource>(wire).unwrap(), adopted);
}
}