use apollo_federation::subgraph::typestate::{Initial, Subgraph, Validated};
use apollo_federation::subgraph::SubgraphError;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
pub struct SubgraphDefinition {
pub name: String,
pub url: String,
pub sdl: String,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
pub struct SatisfiabilityResult {
pub errors: Option<Vec<GraphQLError>>,
pub hints: Option<Vec<CompositionHint>>,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
pub struct CompositionHint {
pub message: String,
pub nodes: Option<Vec<SubgraphASTNode>>,
pub definition: HintCodeDefinition,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
pub struct HintCodeDefinition {
pub code: String,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
pub struct SubgraphASTNode {
pub loc: Option<Location>,
pub subgraph: Option<String>,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Location {
pub start_token: Token,
pub end_token: Token,
}
#[derive(Debug, Clone, Eq, Hash, PartialEq, Deserialize, Serialize)]
pub struct Token {
pub column: Option<usize>,
pub line: Option<usize>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
pub struct GraphQLError {
pub message: String,
pub nodes: Option<Vec<SubgraphASTNode>>,
pub extensions: Option<GraphQLErrorExtensions>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
pub struct GraphQLErrorExtensions {
pub code: String,
}
impl TryFrom<SubgraphDefinition> for Subgraph<Initial> {
type Error = SubgraphError;
fn try_from(value: SubgraphDefinition) -> Result<Self, Self::Error> {
Subgraph::parse(value.name.as_str(), value.url.as_str(), value.sdl.as_str())
}
}
impl From<Subgraph<Validated>> for SubgraphDefinition {
fn from(value: Subgraph<Validated>) -> Self {
SubgraphDefinition {
sdl: value.schema_string(),
name: value.name,
url: value.url,
}
}
}