graphql_federated_graph/federated_graph/directives/
override.rsuse crate::{StringId, SubgraphId};
#[derive(serde::Serialize, serde::Deserialize, Clone)]
pub struct Override {
pub graph: SubgraphId,
pub from: OverrideSource,
#[serde(default)]
pub label: OverrideLabel,
}
#[derive(serde::Serialize, serde::Deserialize, Clone, Default, Debug, PartialEq, PartialOrd)]
pub enum OverrideLabel {
Percent(u8),
#[serde(other)]
#[default]
Unknown,
}
impl OverrideLabel {
pub fn as_percent(&self) -> Option<u8> {
if let Self::Percent(v) = self {
Some(*v)
} else {
None
}
}
}
impl std::fmt::Display for OverrideLabel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OverrideLabel::Percent(percent) => {
f.write_str("percent(")?;
percent.fmt(f)?;
f.write_str(")")
}
OverrideLabel::Unknown => Ok(()),
}
}
}
impl std::str::FromStr for OverrideLabel {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Some(percent) = s
.strip_prefix("percent(")
.and_then(|suffix| suffix.strip_suffix(')'))
.and_then(|percent| u8::from_str(percent).ok())
{
Ok(OverrideLabel::Percent(percent))
} else {
Err(r#"Expected a field of the format "percent(<number>)" "#)
}
}
}
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone, PartialEq, PartialOrd)]
pub enum OverrideSource {
Subgraph(SubgraphId),
Missing(StringId),
}