use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
compiler::fact_table::FactTableMetadata, schema::GraphQLValue, validation::ValidationRule,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AuthoringIR {
pub types: Vec<IRType>,
#[serde(default)]
pub enums: Vec<IREnum>,
#[serde(default)]
pub interfaces: Vec<IRInterface>,
#[serde(default)]
pub unions: Vec<IRUnion>,
#[serde(default)]
pub input_types: Vec<IRInputType>,
#[serde(default)]
pub scalars: Vec<IRScalar>,
pub queries: Vec<IRQuery>,
pub mutations: Vec<IRMutation>,
pub subscriptions: Vec<IRSubscription>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub fact_tables: HashMap<String, FactTableMetadata>,
}
impl AuthoringIR {
#[must_use]
pub fn new() -> Self {
Self {
types: Vec::new(),
enums: Vec::new(),
interfaces: Vec::new(),
unions: Vec::new(),
input_types: Vec::new(),
scalars: Vec::new(),
queries: Vec::new(),
mutations: Vec::new(),
subscriptions: Vec::new(),
fact_tables: HashMap::new(),
}
}
}
impl Default for AuthoringIR {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IRType {
pub name: String,
pub fields: Vec<IRField>,
pub sql_source: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IRField {
pub name: String,
pub field_type: String,
pub nullable: bool,
pub description: Option<String>,
pub sql_column: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRQuery {
pub name: String,
pub return_type: String,
pub returns_list: bool,
pub nullable: bool,
pub arguments: Vec<IRArgument>,
pub sql_source: Option<String>,
pub description: Option<String>,
pub auto_params: AutoParams,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRMutation {
pub name: String,
pub return_type: String,
pub nullable: bool,
pub arguments: Vec<IRArgument>,
pub description: Option<String>,
pub operation: MutationOperation,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRSubscription {
pub name: String,
pub return_type: String,
pub arguments: Vec<IRArgument>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRArgument {
pub name: String,
pub arg_type: String,
pub nullable: bool,
pub default_value: Option<GraphQLValue>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct AutoParams {
#[serde(default)]
pub has_where: bool,
#[serde(default)]
pub has_order_by: bool,
#[serde(default)]
pub has_limit: bool,
#[serde(default)]
pub has_offset: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum MutationOperation {
Create,
Update,
Delete,
Custom,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IREnum {
pub name: String,
pub values: Vec<IREnumValue>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IREnumValue {
pub name: String,
pub description: Option<String>,
pub deprecation_reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IRInterface {
pub name: String,
pub fields: Vec<IRField>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IRUnion {
pub name: String,
pub types: Vec<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRInputType {
pub name: String,
pub fields: Vec<IRInputField>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRInputField {
pub name: String,
pub field_type: String,
pub nullable: bool,
pub default_value: Option<GraphQLValue>,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IRScalar {
pub name: String,
pub description: Option<String>,
pub specified_by_url: Option<String>,
#[serde(default)]
pub validation_rules: Vec<ValidationRule>,
pub base_type: Option<String>,
}
impl IRScalar {
#[must_use]
pub const fn new(name: String) -> Self {
Self {
name,
description: None,
specified_by_url: None,
validation_rules: Vec::new(),
base_type: None,
}
}
}