in compiler/crates/graphql-syntax/src/parser.rs [1574:1686]
fn parse_literal_value(&mut self) -> ParseResult<ConstantValue> {
let token = self.parse_token();
let source = self.source(&token);
match &token.kind {
TokenKind::StringLiteral => {
let value = source[1..source.len() - 1].to_string();
Ok(ConstantValue::String(StringNode {
token,
value: value.intern(),
}))
}
TokenKind::BlockStringLiteral => {
let value = clean_block_string_literal(source);
Ok(ConstantValue::String(StringNode {
token,
value: value.intern(),
}))
}
TokenKind::IntegerLiteral => {
let value = source.parse::<i64>();
match value {
Ok(value) => Ok(ConstantValue::Int(IntNode { token, value })),
Err(_) => {
let error = Diagnostic::error(
SyntaxError::InvalidInteger,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
}
}
TokenKind::FloatLiteral => {
let value = source.parse::<f64>();
match value {
Ok(value) => Ok(ConstantValue::Float(FloatNode {
token,
value: FloatValue::new(value),
source_value: source.intern(),
})),
Err(_) => {
let error = Diagnostic::error(
SyntaxError::InvalidFloat,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
}
}
TokenKind::Identifier => Ok(match source {
"true" => ConstantValue::Boolean(BooleanNode { token, value: true }),
"false" => ConstantValue::Boolean(BooleanNode {
token,
value: false,
}),
"null" => ConstantValue::Null(token),
_ => ConstantValue::Enum(EnumNode {
token,
value: source.intern(),
}),
}),
TokenKind::ErrorFloatLiteralMissingZero => {
let error = Diagnostic::error(
SyntaxError::InvalidFloatLiteralMissingZero,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
TokenKind::ErrorNumberLiteralLeadingZero
| TokenKind::ErrorNumberLiteralTrailingInvalid => {
let error = Diagnostic::error(
SyntaxError::InvalidNumberLiteral,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
TokenKind::ErrorUnsupportedStringCharacter => {
let error = Diagnostic::error(
SyntaxError::UnsupportedStringCharacter,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
TokenKind::ErrorUnterminatedString => {
let error = Diagnostic::error(
SyntaxError::UnterminatedString,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
TokenKind::ErrorUnterminatedBlockString => {
let error = Diagnostic::error(
SyntaxError::UnterminatedBlockString,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
_ => {
let error = Diagnostic::error(
SyntaxError::ExpectedConstantValue,
Location::new(self.source_location, token.span),
);
self.record_error(error);
Err(())
}
}
}