use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use super::{directive::DirectiveDefinition, mutation::MutationDefinition, query::QueryDefinition};
use crate::{
compiler::fact_table::FactTableMetadata,
schema::{
config_types::{
ChangelogConfig, DebugConfig, FederationConfig, GrpcConfig, McpConfig,
NamingConvention, ObserversConfig, RestConfig, SessionVariablesConfig,
SubscriptionsConfig, ValidationConfig,
},
graphql_type_defs::{
EnumDefinition, InputObjectDefinition, InterfaceDefinition, TypeDefinition,
UnionDefinition,
},
hierarchy::HierarchiesConfig,
observer_types::ObserverDefinition,
security_config::SecurityConfig,
source_types::SourceDefinition,
subscription_types::SubscriptionDefinition,
},
validation::CustomTypeRegistry,
};
pub const CURRENT_SCHEMA_FORMAT_VERSION: u32 = 1;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SubscribableEntity {
pub entity_type: String,
pub tables: Vec<String>,
#[serde(default, skip_serializing_if = "core::ops::Not::not")]
pub pre_image: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CompiledSchema {
#[serde(default)]
pub types: Vec<TypeDefinition>,
#[serde(default)]
pub enums: Vec<EnumDefinition>,
#[serde(default)]
pub input_types: Vec<InputObjectDefinition>,
#[serde(default)]
pub interfaces: Vec<InterfaceDefinition>,
#[serde(default)]
pub unions: Vec<UnionDefinition>,
#[serde(default)]
pub queries: Vec<QueryDefinition>,
#[serde(default)]
pub mutations: Vec<MutationDefinition>,
#[serde(default)]
pub subscriptions: Vec<SubscriptionDefinition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub directives: Vec<DirectiveDefinition>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub fact_tables: HashMap<String, FactTableMetadata>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub observers: Vec<ObserverDefinition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub sources: Vec<SourceDefinition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub subscribable: Vec<SubscribableEntity>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub operation_cost_weights: HashMap<String, usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub federation: Option<FederationConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub security: Option<SecurityConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observers_config: Option<ObserversConfig>,
#[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<GrpcConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub changelog: Option<ChangelogConfig>,
#[serde(default)]
pub session_variables: SessionVariablesConfig,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hierarchies_config: Option<HierarchiesConfig>,
#[serde(default)]
pub naming_convention: NamingConvention,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub naming_acronyms: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub schema_format_version: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub schema_sdl: Option<String>,
#[serde(skip)]
pub custom_scalars: CustomTypeRegistry,
#[serde(skip)]
pub query_index: HashMap<String, usize>,
#[serde(skip)]
pub mutation_index: HashMap<String, usize>,
#[serde(skip)]
pub subscription_index: HashMap<String, usize>,
}
impl PartialEq for CompiledSchema {
fn eq(&self, other: &Self) -> bool {
self.schema_format_version == other.schema_format_version
&& self.types == other.types
&& self.enums == other.enums
&& self.input_types == other.input_types
&& self.interfaces == other.interfaces
&& self.unions == other.unions
&& self.queries == other.queries
&& self.mutations == other.mutations
&& self.subscriptions == other.subscriptions
&& self.directives == other.directives
&& self.fact_tables == other.fact_tables
&& self.observers == other.observers
&& self.sources == other.sources
&& self.subscribable == other.subscribable
&& self.federation == other.federation
&& self.security == other.security
&& self.observers_config == other.observers_config
&& self.subscriptions_config == other.subscriptions_config
&& self.validation_config == other.validation_config
&& self.debug_config == other.debug_config
&& self.mcp_config == other.mcp_config
&& self.changelog == other.changelog
&& self.naming_convention == other.naming_convention
&& self.naming_acronyms == other.naming_acronyms
&& self.schema_sdl == other.schema_sdl
}
}
impl CompiledSchema {
#[must_use]
pub fn new() -> Self {
Self::default()
}
}