use crate::ast::*;
use crate::span::Span;
use crate::values::*;
#[derive(Debug, Clone)]
pub struct ServerBuilder {
pub(crate) config: ServerConfig,
}
impl ServerBuilder {
#[must_use]
pub fn new(hostname: impl Into<String>) -> Self {
Self {
config: ServerConfig {
hostname: hostname.into(),
..Default::default()
},
}
}
#[must_use]
pub fn iburst(mut self) -> Self {
self.config.iburst = true;
self
}
#[must_use]
pub fn burst(mut self) -> Self {
self.config.burst = true;
self
}
#[must_use]
pub fn prefer(mut self) -> Self {
self.config.select_opts.set(SelectOptions::PREFER);
self
}
#[must_use]
pub fn noselect(mut self) -> Self {
self.config.select_opts.set(SelectOptions::NOSELECT);
self
}
#[must_use]
pub fn trust(mut self) -> Self {
self.config.select_opts.set(SelectOptions::TRUST);
self
}
#[must_use]
pub fn require(mut self) -> Self {
self.config.select_opts.set(SelectOptions::REQUIRE);
self
}
#[must_use]
pub fn nts(mut self) -> Self {
self.config.nts = true;
self
}
#[must_use]
pub fn offline(mut self) -> Self {
self.config.connectivity = SourceConnectivity::Offline;
self
}
#[must_use]
pub fn minpoll(mut self, poll: PollInterval) -> Self {
self.config.minpoll = poll;
self
}
#[must_use]
pub fn maxpoll(mut self, poll: PollInterval) -> Self {
self.config.maxpoll = poll;
self
}
#[must_use]
pub fn port(mut self, port: UdpPort) -> Self {
self.config.port = port;
self
}
#[must_use]
pub fn ntsport(mut self, port: UdpPort) -> Self {
self.config.nts_port = port;
self
}
#[must_use]
pub fn maxdelay(mut self, delay: f64) -> Self {
self.config.max_delay = delay;
self
}
#[must_use]
pub fn maxdelayratio(mut self, ratio: f64) -> Self {
self.config.max_delay_ratio = ratio;
self
}
#[must_use]
pub fn maxdelaydevratio(mut self, ratio: f64) -> Self {
self.config.max_delay_dev_ratio = ratio;
self
}
#[must_use]
pub fn maxdelayquant(mut self, quant: f64) -> Self {
self.config.max_delay_quant = quant;
self
}
#[must_use]
pub fn mindelay(mut self, delay: f64) -> Self {
self.config.min_delay = delay;
self
}
#[must_use]
pub fn asymmetry(mut self, asym: f64) -> Self {
self.config.asymmetry = asym;
self
}
#[must_use]
pub fn auto_offline(mut self) -> Self {
self.config.auto_offline = true;
self
}
#[must_use]
pub fn xleave(mut self) -> Self {
self.config.interleaved = true;
self
}
#[must_use]
pub fn copy(mut self) -> Self {
self.config.copy = true;
self
}
#[must_use]
pub fn presend(mut self, poll: PollInterval) -> Self {
self.config.presend = poll;
self
}
#[must_use]
pub fn filter(mut self, n: u32) -> Self {
self.config.filter = Some(n);
self
}
#[must_use]
pub fn family(mut self, family: AddressFamily) -> Self {
self.config.family = family;
self
}
#[must_use]
pub fn extfield(mut self, id: u32) -> Self {
self.config.ext_fields = id;
self
}
#[must_use]
pub fn offset(mut self, offset: f64) -> Self {
self.config.offset = offset;
self
}
#[must_use]
pub fn version(mut self, version: NtpVersion) -> Self {
self.config.version = Some(version);
self
}
#[must_use]
pub fn key(mut self, key_id: u32) -> Self {
self.config.authkey = key_id;
self
}
#[must_use]
pub fn authkey(mut self, key_id: u32) -> Self {
self.config.authkey = key_id;
self
}
#[must_use]
pub fn minsamples(mut self, n: u32) -> Self {
self.config.min_samples = Some(n);
self
}
#[must_use]
pub fn maxsamples(mut self, n: u32) -> Self {
self.config.max_samples = Some(n);
self
}
#[must_use]
pub fn polltarget(mut self, target: PollTarget) -> Self {
self.config.poll_target = target;
self
}
#[must_use]
pub fn minstratum(mut self, stratum: Stratum) -> Self {
self.config.min_stratum = stratum;
self
}
#[must_use]
pub fn certset(mut self, id: u32) -> Self {
self.config.cert_set = id;
self
}
#[must_use]
pub fn build(self) -> Box<Directive> {
Box::new(Directive::new(
DirectiveKind::Server(self.config),
Span::new(None, 0, 0, 0),
))
}
}
#[derive(Debug, Clone)]
pub struct PoolBuilder {
config: PoolConfig,
}
impl PoolBuilder {
#[must_use]
pub fn new(hostname: impl Into<String>) -> Self {
Self {
config: PoolConfig {
source: ServerConfig {
hostname: hostname.into(),
..Default::default()
},
max_sources: 4,
},
}
}
#[must_use]
pub fn iburst(mut self) -> Self {
self.config.source.iburst = true;
self
}
#[must_use]
pub fn burst(mut self) -> Self {
self.config.source.burst = true;
self
}
#[must_use]
pub fn prefer(mut self) -> Self {
self.config.source.select_opts.set(SelectOptions::PREFER);
self
}
#[must_use]
pub fn noselect(mut self) -> Self {
self.config.source.select_opts.set(SelectOptions::NOSELECT);
self
}
#[must_use]
pub fn trust(mut self) -> Self {
self.config.source.select_opts.set(SelectOptions::TRUST);
self
}
#[must_use]
pub fn require(mut self) -> Self {
self.config.source.select_opts.set(SelectOptions::REQUIRE);
self
}
#[must_use]
pub fn nts(mut self) -> Self {
self.config.source.nts = true;
self
}
#[must_use]
pub fn offline(mut self) -> Self {
self.config.source.connectivity = SourceConnectivity::Offline;
self
}
#[must_use]
pub fn minpoll(mut self, poll: PollInterval) -> Self {
self.config.source.minpoll = poll;
self
}
#[must_use]
pub fn maxpoll(mut self, poll: PollInterval) -> Self {
self.config.source.maxpoll = poll;
self
}
#[must_use]
pub fn port(mut self, port: UdpPort) -> Self {
self.config.source.port = port;
self
}
#[must_use]
pub fn maxdelay(mut self, delay: f64) -> Self {
self.config.source.max_delay = delay;
self
}
#[must_use]
pub fn offset(mut self, offset: f64) -> Self {
self.config.source.offset = offset;
self
}
#[must_use]
pub fn version(mut self, version: NtpVersion) -> Self {
self.config.source.version = Some(version);
self
}
#[must_use]
pub fn key(mut self, key_id: u32) -> Self {
self.config.source.authkey = key_id;
self
}
#[must_use]
pub fn minsamples(mut self, n: u32) -> Self {
self.config.source.min_samples = Some(n);
self
}
#[must_use]
pub fn maxsamples(mut self, n: u32) -> Self {
self.config.source.max_samples = Some(n);
self
}
#[must_use]
pub fn polltarget(mut self, target: PollTarget) -> Self {
self.config.source.poll_target = target;
self
}
#[must_use]
pub fn maxsources(mut self, n: u32) -> Self {
self.config.max_sources = n;
self
}
#[must_use]
pub fn build(self) -> Box<Directive> {
Box::new(Directive::new(
DirectiveKind::Pool(self.config),
Span::new(None, 0, 0, 0),
))
}
}