Skip to main content

libgraphql_parser/
ast.rs

1#[allow(dead_code)]
2pub mod operation {
3    pub type Definition = graphql_parser::query::Definition<'static, String>;
4    pub type Directive = graphql_parser::query::Directive<'static, String>;
5    pub type Document = graphql_parser::query::Document<'static, String>;
6    pub type Field = graphql_parser::query::Field<'static, String>;
7    pub type FragmentDefinition = graphql_parser::query::FragmentDefinition<'static, String>;
8    pub type FragmentSpread = graphql_parser::query::FragmentSpread<'static, String>;
9    pub type InlineFragment = graphql_parser::query::InlineFragment<'static, String>;
10    pub type Mutation = graphql_parser::query::Mutation<'static, String>;
11    pub type OperationDefinition = graphql_parser::query::OperationDefinition<'static, String>;
12    pub type Query = graphql_parser::query::Query<'static, String>;
13    pub type Selection = graphql_parser::query::Selection<'static, String>;
14    pub type SelectionSet = graphql_parser::query::SelectionSet<'static, String>;
15    pub type Subscription = graphql_parser::query::Subscription<'static, String>;
16    pub type Type = graphql_parser::query::Type<'static, String>;
17    pub type TypeCondition = graphql_parser::query::TypeCondition<'static, String>;
18    pub type VariableDefinition = graphql_parser::query::VariableDefinition<'static, String>;
19
20    pub type ParseError = graphql_parser::query::ParseError;
21    pub fn parse(query_src: &str) -> Result<Document, ParseError> {
22        Ok(graphql_parser::query::parse_query::<String>(query_src)?.into_static())
23    }
24}
25
26#[allow(dead_code)]
27pub mod schema {
28    pub type Definition = graphql_parser::schema::Definition<'static, String>;
29    pub type Directive = graphql_parser::query::Directive<'static, String>;
30    pub type DirectiveDefinition = graphql_parser::schema::DirectiveDefinition<'static, String>;
31    pub type DirectiveLocation = graphql_parser::schema::DirectiveLocation;
32    pub type Document = graphql_parser::schema::Document<'static, String>;
33    pub type EnumType = graphql_parser::schema::EnumType<'static, String>;
34    pub type EnumTypeExtension = graphql_parser::schema::EnumTypeExtension<'static, String>;
35    pub type EnumValue = graphql_parser::schema::EnumValue<'static, String>;
36    pub type Field = graphql_parser::schema::Field<'static, String>;
37    pub type InputObjectType = graphql_parser::schema::InputObjectType<'static, String>;
38    pub type InputObjectTypeExtension =
39        graphql_parser::schema::InputObjectTypeExtension<'static, String>;
40    pub type InputValue = graphql_parser::schema::InputValue<'static, String>;
41    pub type InterfaceType = graphql_parser::schema::InterfaceType<'static, String>;
42    pub type InterfaceTypeExtension =
43        graphql_parser::schema::InterfaceTypeExtension<'static, String>;
44    pub type ObjectType = graphql_parser::schema::ObjectType<'static, String>;
45    pub type ObjectTypeExtension = graphql_parser::schema::ObjectTypeExtension<'static, String>;
46    pub type ScalarType = graphql_parser::schema::ScalarType<'static, String>;
47    pub type ScalarTypeExtension = graphql_parser::schema::ScalarTypeExtension<'static, String>;
48    pub type SchemaDefinition = graphql_parser::schema::SchemaDefinition<'static, String>;
49    pub type Type = graphql_parser::schema::Type<'static, String>;
50    pub type TypeDefinition = graphql_parser::schema::TypeDefinition<'static, String>;
51    pub type TypeExtension = graphql_parser::schema::TypeExtension<'static, String>;
52    pub type UnionType = graphql_parser::schema::UnionType<'static, String>;
53    pub type UnionTypeExtension = graphql_parser::schema::UnionTypeExtension<'static, String>;
54
55    pub type ParseError = graphql_parser::schema::ParseError;
56
57    pub fn parse(schema_src: &str) -> Result<Document, ParseError> {
58        Ok(graphql_parser::schema::parse_schema::<String>(schema_src)?.into_static())
59    }
60}
61
62pub type AstPos = graphql_parser::Pos;
63pub type Number = graphql_parser::query::Number;
64pub type Value = graphql_parser::query::Value<'static, String>;
65
66// =============================================================================
67// Mixed document types (for documents containing both schema and executable
68// definitions)
69// =============================================================================
70
71/// A definition that can be either a schema definition or an executable
72/// definition.
73///
74/// This enum allows representing GraphQL documents that contain both type
75/// system definitions (types, directives, etc.) and executable definitions
76/// (operations, fragments) while preserving their relative ordering.
77#[derive(Clone, Debug, PartialEq)]
78pub enum MixedDefinition {
79    /// A schema definition (type, directive, schema, extension).
80    Schema(schema::Definition),
81
82    /// An executable definition (operation or fragment).
83    Executable(operation::Definition),
84}
85
86/// A document that contains both schema and executable definitions,
87/// preserving their original order.
88///
89/// This is useful for tools that process complete GraphQL codebases where
90/// schema definitions and operations may be interleaved. Unlike separate
91/// schema/executable document types, `MixedDocument` preserves the exact
92/// ordering of definitions as they appeared in the source.
93///
94/// # Example
95///
96/// A file containing interleaved type definitions and queries:
97/// ```graphql
98/// type User {
99///     id: ID!
100///     name: String
101/// }
102///
103/// query GetUser($id: ID!) {
104///     user(id: $id) { name }
105/// }
106///
107/// type Post {
108///     id: ID!
109///     author: User!
110/// }
111/// ```
112///
113/// The `definitions` vector will contain `[User type, GetUser query, Post
114/// type]` in that exact order.
115#[derive(Clone, Debug, PartialEq)]
116pub struct MixedDocument {
117    /// All definitions in the document, in their original source order.
118    pub definitions: Vec<MixedDefinition>,
119}
120
121pub mod serde_adapters {
122    #[derive(serde::Deserialize, serde::Serialize)]
123    #[serde(remote = "crate::ast::Number")]
124    pub struct SerdeNumber(#[serde(getter = "SerdeNumber::as_i32")] pub(crate) i32);
125
126    impl SerdeNumber {
127        fn as_i32(num: &crate::ast::Number) -> i32 {
128            num.as_i64().unwrap() as i32
129        }
130    }
131
132    impl std::convert::From<SerdeNumber> for crate::ast::Number {
133        fn from(value: SerdeNumber) -> Self {
134            value.0.into()
135        }
136    }
137}