• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::fmt;
2 
3 use crate::{ParseError, err::{perr, ParseErrorKind::*}};
4 
5 
6 /// A bool literal: `true` or `false`. Also see [the reference][ref].
7 ///
8 /// Notice that, strictly speaking, from Rust point of view "boolean literals" are not
9 /// actual literals but [keywords].
10 ///
11 /// [ref]: https://doc.rust-lang.org/reference/expressions/literal-expr.html#boolean-literal-expressions
12 /// [keywords]: https://doc.rust-lang.org/reference/keywords.html#strict-keywords
13 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
14 pub enum BoolLit {
15     False,
16     True,
17 }
18 
19 impl BoolLit {
20     /// Parses the input as a bool literal. Returns an error if the input is
21     /// invalid or represents a different kind of literal.
parse(s: &str) -> Result<Self, ParseError>22     pub fn parse(s: &str) -> Result<Self, ParseError> {
23         match s {
24             "false" => Ok(Self::False),
25             "true" => Ok(Self::True),
26             _ => Err(perr(None, InvalidLiteral)),
27         }
28     }
29 
30     /// Returns the actual Boolean value of this literal.
value(self) -> bool31     pub fn value(self) -> bool {
32         match self {
33             Self::False => false,
34             Self::True => true,
35         }
36     }
37 
38     /// Returns the literal as string.
as_str(&self) -> &'static str39     pub fn as_str(&self) -> &'static str {
40         match self {
41             Self::False => "false",
42             Self::True => "true",
43         }
44     }
45 }
46 
47 impl fmt::Display for BoolLit {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result48     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49         f.pad(self.as_str())
50     }
51 }
52 
53 
54 #[cfg(test)]
55 mod tests;
56