Skip to main content

justpdf_core/tokenizer/
token.rs

1/// A keyword recognized by the PDF tokenizer.
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum Keyword {
4    True,
5    False,
6    Null,
7    Obj,
8    EndObj,
9    Stream,
10    EndStream,
11    Xref,
12    Trailer,
13    StartXref,
14    R,
15}
16
17impl Keyword {
18    pub fn from_bytes(b: &[u8]) -> Option<Self> {
19        match b {
20            b"true" => Some(Self::True),
21            b"false" => Some(Self::False),
22            b"null" => Some(Self::Null),
23            b"obj" => Some(Self::Obj),
24            b"endobj" => Some(Self::EndObj),
25            b"stream" => Some(Self::Stream),
26            b"endstream" => Some(Self::EndStream),
27            b"xref" => Some(Self::Xref),
28            b"trailer" => Some(Self::Trailer),
29            b"startxref" => Some(Self::StartXref),
30            b"R" => Some(Self::R),
31            _ => None,
32        }
33    }
34}
35
36/// A single token produced by the PDF tokenizer.
37#[derive(Debug, Clone, PartialEq)]
38pub enum Token {
39    /// Integer number.
40    Integer(i64),
41    /// Real (floating-point) number.
42    Real(f64),
43    /// Literal string `(...)`, stored as raw decoded bytes.
44    LiteralString(Vec<u8>),
45    /// Hex string `<...>`, stored as decoded bytes.
46    HexString(Vec<u8>),
47    /// Name object (without leading `/`).
48    Name(Vec<u8>),
49    /// A recognized PDF keyword.
50    Keyword(Keyword),
51    /// `[`
52    ArrayBegin,
53    /// `]`
54    ArrayEnd,
55    /// `<<`
56    DictBegin,
57    /// `>>`
58    DictEnd,
59}
60
61impl Token {
62    pub fn is_keyword(&self, kw: Keyword) -> bool {
63        matches!(self, Token::Keyword(k) if *k == kw)
64    }
65}