#![warn(missing_docs)]
#![doc(test(attr(deny(warnings))))]
macro_rules! generic_item_warning_doc {
($item_name:literal) => {
concat!(
"
<div style=\"color: black; background-color:yellow\">
⚠️ This doc is about the generic implementation, but it applies to the
domain-specific aliases too. You should use the domain-specific aliases only:
</div>
* [`crate::bytes::",
$item_name,
"`]
* [`crate::chars::",
$item_name,
"`]
---
"
)
};
}
macro_rules! generic_item_link_doc {
($item_name:literal) => {
concat!(
"
See the doc for the generic item [`crate::engine::",
$item_name,
"`] for more info."
)
};
}
macro_rules! generic_item_delegation_doc {
($item_name:literal) => {
concat!(
"
It simply delegates to the generic item [`crate::engine::",
$item_name,
"`]. See its doc for more info."
)
};
}
pub mod engine;
macro_rules! domain_module {
($name:ident, $domain:ty, $doc:literal) => {
#[doc = $doc]
pub mod $name {
use std::fs::File;
use std::io::Read;
use std::io::Write;
use std::path::Path;
use crate::engine::domain::Domain;
pub use crate::engine::LineBreak;
pub use crate::engine::position::Position;
pub use crate::engine::position::WithPosition;
pub use crate::engine::ReadError;
pub use crate::engine::ReadResult;
#[doc = generic_item_link_doc!("tokenizer::Tokenizer")]
pub type Tokenizer<R> = super::engine::tokenizer::Tokenizer<$domain, R>;
#[doc = generic_item_link_doc!("tokenizer::Token")]
pub type Token = super::engine::tokenizer::Token<$domain>;
#[doc = generic_item_link_doc!("reader::Reader")]
pub type Reader<R> = super::engine::reader::Reader<$domain, R>;
#[doc = generic_item_delegation_doc!("read_file")]
#[inline]
pub fn read_file<P: AsRef<Path>>(path: P) -> ReadResult<Reader<File>> {
crate::engine::read_file(path)
}
#[doc = generic_item_delegation_doc!("read")]
#[inline]
pub fn read<R: Read>(reader: R) -> Reader<R> {
crate::engine::read(reader)
}
pub use crate::engine::WriteError;
pub use crate::engine::WriteResult;
#[doc = generic_item_link_doc!("options::Options")]
pub type Options = super::engine::options::Options<$domain>;
#[doc = generic_item_link_doc!("fluent_writer::FluentWriter")]
pub type FluentWriter<W> = super::engine::fluent_writer::FluentWriter<$domain, W>;
#[doc = generic_item_link_doc!("writer::Writer")]
pub type Writer<W> = super::engine::writer::Writer<$domain, W>;
#[doc = generic_item_link_doc!("writer::RowWriter")]
pub type RowWriter<'a, W> = super::engine::writer::RowWriter<'a, $domain, W>;
#[doc = generic_item_delegation_doc!("write_file")]
#[inline]
pub fn write_file<'a, P: AsRef<Path>>(
path: P,
rows: impl IntoIterator<
Item = impl IntoIterator<Item = &'a <$domain as Domain>::StringSlice>,
>,
) -> WriteResult<()>
where
<$domain as Domain>::StringSlice: 'a,
{
crate::engine::write_file::<'a, $domain, P>(path, rows)
}
#[doc = generic_item_delegation_doc!("write")]
#[inline]
pub fn write<'a, W: Write>(
writer: W,
rows: impl IntoIterator<
Item = impl IntoIterator<Item = &'a <$domain as Domain>::StringSlice>,
>,
) -> WriteResult<()>
where
<$domain as Domain>::StringSlice: 'a,
{
crate::engine::write::<$domain, W>(writer, rows)
}
}
};
}
domain_module!(
chars,
super::engine::domain::CharsDomain,
"Types and functions to operate on `char`/`String`/`&str`."
);
domain_module!(
bytes,
super::engine::domain::BytesDomain,
"Types and functions to operate on `u8`/`Vec<u8>`/`&[u8]`."
);
#[cfg(test)]
mod tests;