use crate::zones::preprocessor::preprocess;
use crate::zones::parser::Rule;
use crate::zones::parser::ZoneParser;
use crate::Class;
use crate::Resource;
use pest_consume::Parser;
use std::str::FromStr;
use std::time::Duration;
use strum_macros::Display;
mod parser;
mod parser_tests;
mod preprocessor;
mod process;
#[derive(Clone, Debug, PartialEq)]
pub struct File {
pub origin: Option<String>,
pub entries: Vec<Entry>,
}
impl File {
pub fn new(mut origin: Option<String>, entries: Vec<Entry>) -> File {
if let Some(domain) = origin {
if let Some(domain) = domain.strip_suffix('.') {
origin = Some(domain.to_owned())
} else {
panic!("TODO Origin wasn't a absolute domain");
}
}
File { origin, entries }
}
}
impl FromStr for File {
type Err = pest_consume::Error<Rule>;
fn from_str(input_str: &str) -> Result<Self, Self::Err> {
let input_str = preprocess(input_str).unwrap();
let inputs = ZoneParser::parse(Rule::file, &input_str)?;
let input = inputs.single()?;
ZoneParser::file(input).map(|x| File::new(None, x))
}
}
#[derive(Clone, Debug, Display, PartialEq)]
pub enum Entry {
Origin(String),
TTL(Duration),
Record(Record),
}
#[derive(Clone, Debug, PartialEq)]
pub struct Record {
pub name: Option<String>,
pub ttl: Option<Duration>,
pub class: Option<Class>,
pub resource: Resource,
}
impl Default for Record {
fn default() -> Self {
Self {
name: None,
ttl: None,
class: None,
resource: Resource::ANY, }
}
}
impl FromStr for Record {
type Err = pest_consume::Error<Rule>;
fn from_str(input_str: &str) -> Result<Self, Self::Err> {
let inputs = ZoneParser::parse(Rule::single_record, input_str)?;
let input = inputs.single()?;
ZoneParser::single_record(input)
}
}