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