chrony-confile 0.1.0

A full-featured Rust library for parsing, editing, validating, and serializing chrony configuration files
Documentation
//! `.sources` file parsing types.
//!
//! Chrony uses `.sources` files (typically in `/var/lib/chrony`) to persist known NTP sources.
//! This module provides lenient parsing that silently skips erroneous lines.

use crate::ast::source::{PeerConfig, PoolConfig, ServerConfig};

/// A single source entry in a `.sources` file.
///
/// Each entry is one of `server`, `pool`, or `peer` with its full configuration.
#[derive(Debug, Clone, PartialEq)]
pub enum SourceEntry {
    /// A `server` directive entry.
    Server(ServerConfig),
    /// A `pool` directive entry.
    Pool(PoolConfig),
    /// A `peer` directive entry.
    Peer(PeerConfig),
}

/// A single node in a `.sources` file.
///
/// Analogous to [`ConfigNode`](crate::ConfigNode) but limited to server/pool/peer entries.
#[derive(Debug, Clone, PartialEq)]
pub enum SourceNode {
    /// A source entry (server, pool, or peer).
    Entry(SourceEntry),
    /// A comment line.
    Comment(String),
    /// An empty or whitespace-only line.
    BlankLine,
}

/// A parsed `.sources` file.
///
/// Chrony writes `.sources` files to persist known NTP sources. Unlike the main
/// configuration parser, this parser is always lenient: unparseable lines and
/// unknown directives are silently skipped.
///
/// # Examples
///
/// ## Parsing via `parse()`
///
/// ```rust
/// use chrony_confile::SourceFile;
///
/// let sources = SourceFile::parse("\
/// server ntp1.example.com iburst
/// pool pool.ntp.org maxsources 6
/// ");
///
/// assert_eq!(sources.nodes.len(), 2);
/// ```
///
/// ## Parsing via `FromStr`
///
/// ```rust
/// use chrony_confile::SourceFile;
///
/// let sources: SourceFile = "\
/// server ntp1.example.com
/// peer 192.168.1.1
/// ".parse().unwrap();
///
/// assert_eq!(sources.nodes.len(), 2);
/// ```
#[derive(Debug, Clone, Default, PartialEq)]
pub struct SourceFile {
    /// The ordered list of source nodes.
    pub nodes: Vec<SourceNode>,
}

impl std::str::FromStr for SourceFile {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(Self::parse(s))
    }
}