use crate::*;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct Source(Vec<Arc<str>>);
impl Source {
pub(crate) fn new(logger: impl Into<String>) -> Self {
Self(vec![logger.into().into()])
}
pub(crate) fn session(&self, session: impl Into<String>) -> Self {
let mut src = self.0.iter().cloned().collect::<Vec<_>>();
src.push(session.into().into());
Self(src)
}
pub fn raw(&self) -> &[Arc<str>] {
&self.0
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_from_logger(&self) -> bool {
self.0.len() == 1
}
pub fn is_from_session(&self) -> bool {
self.0.len() > 1
}
pub fn logger(&self) -> &Arc<str> {
self.0.first().unwrap()
}
}
impl Output for Source {
fn for_write(&self, f: &mut impl std::fmt::Write) {
write!(f, "{}", self.0.first().unwrap()).unwrap();
if self.0.len() > 1 {
write!(f, ":{}", self.0.last ().unwrap()).unwrap();
}
}
fn for_print(&self, f: &mut impl std::fmt::Write) {
write!(f, "{}", self.0.join(":")).unwrap();
}
}