Выход из ключевого слова в макросе из graphql-client - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать ящик graphql-client для отправки запросов к схеме graphql, которая выглядит примерно так

enum AttributeType {
    // ...
}

type Attribute {
    name: String!
    type: AttributeType!
}

Использование этого

#[derive(GraphQLQuery)]
#[graphql(
    schema_path = "src/graphql/schema.graphql",
    query_path = "src/graphql/create_something.graphql"
)]
pub struct MutateSomethingModule;

Когда я пытаюсь использовать graphql-клиент, я получаю сообщение об ошибке:

error: expected identifier, found keyword `type`
  --> src/x/mod.rs:14:10
   |
14 | #[derive(GraphQLQuery)]
   |          ^^^^^^^^^^^^ expected identifier, found keyword
help: you can escape reserved keywords to use them as identifiers
   |
14 | #[derive(r#type)]
   |          ^^^^^^

error: proc-macro derive produced unparseable tokens
  --> src/x/mod.rs:14:10
   |
14 | #[derive(GraphQLQuery)]
   |          ^^^^^^^^^^^^

Я предполагаю, что это сообщение об ошибке жалуется на то, что у меня есть слово type, поскольку имя является моей схемой и что я должен каким-то образом избежать его. На основании сообщения об ошибке я попытался заменить type: на r#type:, r#"type"# и некоторые другие подобные варианты.

Как правильно это сделать?

1 Ответ

0 голосов
/ 07 января 2019

На основе по коду , к ключевым словам добавлено подчеркивание:

// List of keywords based on https://doc.rust-lang.org/grammar.html#keywords
let reserved = &[
    "abstract", "alignof", "as", "become", "box", "break", "const", "continue", "crate", "do",
    "else", "enum", "extern", "false", "final", "fn", "for", "if", "impl", "in", "let", "loop",
    "macro", "match", "mod", "move", "mut", "offsetof", "override", "priv", "proc", "pub",
    "pure", "ref", "return", "Self", "self", "sizeof", "static", "struct", "super", "trait",
    "true", "type", "typeof", "unsafe", "unsized", "use", "virtual", "where", "while", "yield",
];

if reserved.contains(&field_name) {
    let name_ident = Ident::new(&format!("{}_", field_name), Span::call_site());
    return quote! {
        #description
        #deprecation
        #[serde(rename = #field_name)]
        pub #name_ident: #field_type
    };
}

Это означает, что type должно быть доступно как type_.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...