pub mod advanced_types;
pub mod analytics;
pub mod drift_guard;
pub mod fragments;
pub mod operations;
pub mod subscriptions;
pub mod types;
pub use advanced_types::{
IntermediateInputField, IntermediateInputObject, IntermediateInterface, IntermediateUnion,
};
pub use analytics::{
IntermediateAggregateQuery, IntermediateDimensionPath, IntermediateDimensions,
IntermediateFactTable, IntermediateFilter, IntermediateMeasure,
};
pub use drift_guard::reject_drifted_keys;
pub use fragments::{
IntermediateAppliedDirective, IntermediateDirective, IntermediateFragment,
IntermediateFragmentField, IntermediateFragmentFieldDef,
};
use fraiseql_core::schema::{
DebugConfig, McpConfig, NamingConvention, RestConfig, SessionVariablesConfig,
SubscriptionsConfig, ValidationConfig,
};
pub use operations::{
IntermediateArgument, IntermediateAutoParams, IntermediateInjectDefaults, IntermediateMutation,
IntermediateQuery, IntermediateQueryDefaults, IntermediateRest,
};
use serde::{Deserialize, Serialize};
pub use subscriptions::{
IntermediateFilterCondition, IntermediateObserver, IntermediateObserverAction,
IntermediateRetryConfig, IntermediateSubscription, IntermediateSubscriptionFilter,
};
pub use types::{
IntermediateDeprecation, IntermediateEnum, IntermediateEnumValue, IntermediateField,
IntermediateRelationship, IntermediateScalar, IntermediateType,
};
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IntermediateFunctionsConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub module_dir: Option<std::path::PathBuf>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dlq_store: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IntermediateSchema {
#[serde(default = "default_version")]
pub version: String,
#[serde(default)]
pub types: Vec<IntermediateType>,
#[serde(default)]
pub enums: Vec<IntermediateEnum>,
#[serde(default)]
pub input_types: Vec<IntermediateInputObject>,
#[serde(default)]
pub interfaces: Vec<IntermediateInterface>,
#[serde(default)]
pub unions: Vec<IntermediateUnion>,
#[serde(default)]
pub queries: Vec<IntermediateQuery>,
#[serde(default)]
pub mutations: Vec<IntermediateMutation>,
#[serde(default)]
pub subscriptions: Vec<IntermediateSubscription>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fragments: Option<Vec<IntermediateFragment>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub directives: Option<Vec<IntermediateDirective>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fact_tables: Option<Vec<IntermediateFactTable>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub aggregate_queries: Option<Vec<IntermediateAggregateQuery>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observers: Option<Vec<IntermediateObserver>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sources: Option<Vec<fraiseql_core::schema::SourceDefinition>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub functions: Option<Vec<fraiseql_functions::FunctionDefinition>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub functions_config: Option<IntermediateFunctionsConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub custom_scalars: Option<Vec<IntermediateScalar>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub security: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observers_config: Option<serde_json::Value>,
#[serde(default, alias = "federation", skip_serializing_if = "Option::is_none")]
pub federation_config: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subscriptions_config: Option<SubscriptionsConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub validation_config: Option<ValidationConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub debug_config: Option<DebugConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp_config: Option<McpConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rest_config: Option<RestConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub grpc_config: Option<fraiseql_core::schema::GrpcConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub query_defaults: Option<IntermediateQueryDefaults>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inject_defaults: Option<IntermediateInjectDefaults>,
#[serde(default)]
pub naming_convention: NamingConvention,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_variables: Option<SessionVariablesConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub locale: Option<fraiseql_core::schema::LocaleConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hierarchies_config: Option<fraiseql_core::schema::HierarchiesConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub changelog_config: Option<fraiseql_core::schema::ChangelogConfig>,
}
fn default_version() -> String {
"2.0.0".to_string()
}
#[cfg(test)]
mod tests;