use crate::source::SourceSpan;
use super::{FieldReference, Located};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum LoggingOptionValue {
String(String),
Number(String),
Null,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LoggingOption {
name: Located<String>,
value: Located<LoggingOptionValue>,
span: SourceSpan,
}
impl LoggingOption {
pub(crate) const fn new(name: Located<String>, value: Located<LoggingOptionValue>, span: SourceSpan) -> Self {
Self { name, value, span }
}
#[must_use]
pub const fn name(&self) -> &Located<String> {
&self.name
}
#[must_use]
pub const fn value(&self) -> &Located<LoggingOptionValue> {
&self.value
}
#[must_use]
pub const fn span(&self) -> SourceSpan {
self.span
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LoggingOptions {
span: SourceSpan,
entries: Vec<LoggingOption>,
unmodeled_entries: Vec<FieldReference>,
}
impl LoggingOptions {
pub(crate) const fn new(
span: SourceSpan,
entries: Vec<LoggingOption>,
unmodeled_entries: Vec<FieldReference>,
) -> Self {
Self {
span,
entries,
unmodeled_entries,
}
}
#[must_use]
pub const fn span(&self) -> SourceSpan {
self.span
}
#[must_use]
pub fn entries(&self) -> &[LoggingOption] {
&self.entries
}
#[must_use]
pub fn unmodeled_entries(&self) -> &[FieldReference] {
&self.unmodeled_entries
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Logging {
span: SourceSpan,
driver: Option<Located<String>>,
options: Option<LoggingOptions>,
extension_fields: Vec<FieldReference>,
unknown_fields: Vec<FieldReference>,
}
impl Logging {
pub(crate) const fn new(span: SourceSpan) -> Self {
Self {
span,
driver: None,
options: None,
extension_fields: Vec::new(),
unknown_fields: Vec::new(),
}
}
pub(crate) fn set_driver(&mut self, driver: Located<String>) {
self.driver = Some(driver);
}
pub(crate) fn set_options(&mut self, options: LoggingOptions) {
self.options = Some(options);
}
pub(crate) fn push_extension(&mut self, field: FieldReference) {
self.extension_fields.push(field);
}
pub(crate) fn push_unknown(&mut self, field: FieldReference) {
self.unknown_fields.push(field);
}
#[must_use]
pub const fn span(&self) -> SourceSpan {
self.span
}
#[must_use]
pub const fn driver(&self) -> Option<&Located<String>> {
self.driver.as_ref()
}
#[must_use]
pub const fn options(&self) -> Option<&LoggingOptions> {
self.options.as_ref()
}
#[must_use]
pub fn extension_fields(&self) -> &[FieldReference] {
&self.extension_fields
}
#[must_use]
pub fn unknown_fields(&self) -> &[FieldReference] {
&self.unknown_fields
}
}