X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fgraphql%2Fgraphql.h;fp=ccan%2Fgraphql%2Fgraphql.h;h=94f7fa4d44f89a089a322bf52f73b78f04ad56ea;hb=fda36378712fc7b2615f433cd670bc6300a3b0e1;hp=0000000000000000000000000000000000000000;hpb=05ec83512c478e03f0af460d304483ed292337d1;p=ccan diff --git a/ccan/graphql/graphql.h b/ccan/graphql/graphql.h new file mode 100644 index 00000000..94f7fa4d --- /dev/null +++ b/ccan/graphql/graphql.h @@ -0,0 +1,229 @@ +#ifndef __GRAPHQL_H__ +#define __GRAPHQL_H__ 1 + +#include + +#include +#include + +// Coding constants +#define GRAPHQL_SUCCESS 0 + +// The following structures constitute the AST returned by the parser. + +struct graphql_directive { + struct graphql_directive *next; + struct graphql_token *name; + struct graphql_arguments *args; +}; + +struct graphql_directives { + struct graphql_directive *first; +}; + +struct graphql_named_type { + struct graphql_token *name; +}; + +struct graphql_type { + struct graphql_named_type *named; +// struct graphql_list_type *list; +// struct graphql_non_null_type *non_null; +}; + +struct graphql_default_value { + struct graphql_value *val; +}; + +struct graphql_variable_definition { + struct graphql_variable_definition *next; + struct graphql_variable *var; + struct graphql_type *type; + struct graphql_default_value *default_val; + struct graphql_directives *directives; +}; + +struct graphql_variable_definitions { + struct graphql_variable_definition *first; +}; + +struct graphql_variable { + struct graphql_token *name; +}; + +struct graphql_object_field { + struct graphql_object_field *next; + struct graphql_token *name; + struct graphql_value *val; +}; + +struct graphql_object_value { + struct graphql_object_field *first; +}; + +struct graphql_list_value { + struct graphql_token *val; +}; + +struct graphql_enum_value { + struct graphql_token *val; +}; + +struct graphql_null_value { + struct graphql_token *val; +}; + +struct graphql_string_value { + struct graphql_token *val; +}; + +struct graphql_boolean_value { + struct graphql_token *val; +}; + +struct graphql_float_value { + struct graphql_token *val; +}; + +struct graphql_int_value { + struct graphql_token *val; +}; + +struct graphql_value { + struct graphql_variable *var; + struct graphql_int_value *int_val; + struct graphql_float_value *float_val; + struct graphql_boolean_value *bool_val; + struct graphql_string_value *str_val; + struct graphql_null_value *null_val; + struct graphql_enum_value *enum_val; + struct graphql_list_value *list_val; + struct graphql_object_value *obj_val; +}; + +struct graphql_inline_fragment { + struct graphql_type_condition *type_cond; + struct graphql_directives *directives; + struct graphql_selection_set *sel_set; +}; + +struct graphql_type_condition { + struct graphql_named_type *named_type; +}; + +struct graphql_fragment_name { + struct graphql_token *name; +}; + +struct graphql_fragment_definition { + struct graphql_fragment_name *name; + struct graphql_type_condition *type_cond; + struct graphql_directives *directives; + struct graphql_selection_set *sel_set; +}; + +struct graphql_fragment_spread { + struct graphql_fragment_name *name; + struct graphql_directives *directives; +}; + +struct graphql_alias { + struct graphql_token *name; +}; + +struct graphql_argument { + struct graphql_argument *next; + struct graphql_token *name; + struct graphql_value *val; +}; + +struct graphql_arguments { + struct graphql_argument *first; +}; + +struct graphql_field { + struct graphql_alias *alias; + struct graphql_token *name; + struct graphql_arguments *args; + struct graphql_directives *directives; + struct graphql_selection_set *sel_set; +}; + +struct graphql_selection { + struct graphql_selection *next; + struct graphql_field *field; + struct graphql_fragment_spread *frag_spread; + struct graphql_inline_fragment *inline_frag; +}; + +struct graphql_selection_set { + struct graphql_selection *first; +}; + +struct graphql_operation_type { + struct graphql_token *op_type; +}; + +struct graphql_operation_definition { + struct graphql_operation_type *op_type; + struct graphql_token *op_name; + struct graphql_variable_definitions *vars; + struct graphql_directives *directives; + struct graphql_selection_set *sel_set; +}; + +struct graphql_executable_definition { + struct graphql_executable_definition *next_def; + struct graphql_operation_definition *op_def; + struct graphql_fragment_definition *frag_def; +}; + +struct graphql_executable_document { + struct graphql_executable_definition *first_def; +}; + +struct graphql_definition { + struct graphql_definition *next_def; + struct graphql_executable_definition *executable_def; + struct graphql_type_system_definition_or_extension *type_system_def; +}; + +struct graphql_document { + struct graphql_definition *first_def; +}; + + +struct graphql_token { + struct list_node list; + unsigned int token_type; + unsigned int token_specific; + char *token_string; + unsigned int source_line; + unsigned int source_column; + unsigned int source_len; +}; + +/* The lexer. + * INPUTS: + * input - string to parse + * ctx - parent tal context or NULL + * tokens - a variable to receive the resulting token list + * RETURN: + * GRAPHQL_SUCCESS or an error string. + */ +const char *graphql_lex(const char *input, const tal_t *ctx, struct list_head **tokens); + +/* The parser. + * INPUTS: + * tokens - the list produced by the lexer + * doc - a variable to receive the resulting abstract syntax tree (AST) + * RETURN: + * GRAPHQL_SUCCESS or an error string. + */ +const char *graphql_parse(struct list_head *tokens, struct graphql_executable_document **doc); + +/* The lexer and parser in one function, for convenience. */ +const char *graphql_lexparse(const char *input, const tal_t *ctx, struct list_head **tokens, struct graphql_executable_document **doc); + +#endif +