| 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. |
| 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. |
| 31 | 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. |
| 39 | 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 { |
| 48 | 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 | |