Skip to main content

oak_nginx/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6/// Root node of the Nginx AST.
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[derive(Debug, Clone)]
9pub struct NginxRoot {
10    /// The source range covered by this root node.
11    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
12    pub range: Range<usize>,
13    /// The list of top-level items in the Nginx configuration.
14    pub items: Vec<NginxItem>,
15}
16
17/// Represents an item in the Nginx configuration.
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19#[derive(Debug, Clone)]
20pub enum NginxItem {
21    /// A simple directive (e.g., `user nginx;`).
22    Directive(Directive),
23    /// A block directive (e.g., `http { ... }`).
24    Block(Block),
25    /// A comment.
26    Comment(Comment),
27}
28
29/// A simple Nginx directive.
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31#[derive(Debug, Clone)]
32pub struct Directive {
33    pub name: String,
34    pub parameters: Vec<String>,
35    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
36    pub range: Range<usize>,
37}
38
39/// An Nginx block directive.
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
41#[derive(Debug, Clone)]
42pub struct Block {
43    pub name: String,
44    pub parameters: Vec<String>,
45    pub items: Vec<NginxItem>,
46    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
47    pub range: Range<usize>,
48}
49
50/// An Nginx comment.
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52#[derive(Debug, Clone)]
53pub struct Comment {
54    pub text: String,
55    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
56    pub range: Range<usize>,
57}
58
59impl NginxRoot {
60    /// Creates a new `NginxRoot` with the specified range.
61    pub fn new(range: Range<usize>, items: Vec<NginxItem>) -> Self {
62        Self { range, items }
63    }
64}