improve ergonomics

This commit is contained in:
KitsuneCafe 2024-02-04 16:24:34 -05:00
parent dc699e2ee5
commit 48601fc5e6

View file

@ -1,4 +1,4 @@
use std::io::Write; use std::{io::Write, ops::Deref};
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use regex::{Captures, Regex, RegexBuilder}; use regex::{Captures, Regex, RegexBuilder};
@ -13,17 +13,49 @@ const CODE_BLOCK_RE: Lazy<Regex> = Lazy::new(|| {
.unwrap() .unwrap()
}); });
pub enum MaybeOwned<'a, T: 'a> {
Owned(T),
Borrowed(&'a T),
}
impl<'a, T> Deref for MaybeOwned<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
match self {
Self::Owned(v) => &v,
Self::Borrowed(v) => v
}
}
}
impl<'a, T> From<T> for MaybeOwned<'a, T> {
fn from(value: T) -> Self {
Self::Owned(value)
}
}
impl<'a, T> From<&'a T> for MaybeOwned<'a, T> {
fn from(value: &'a T) -> Self {
Self::Borrowed(value)
}
}
pub struct SyntectParser<'a> { pub struct SyntectParser<'a> {
syntax_set: SyntaxSet, syntax_set: MaybeOwned<'a, SyntaxSet>,
theme_set: ThemeSet, theme_set: MaybeOwned<'a, ThemeSet>,
theme: &'a str, theme: &'a str,
} }
impl<'a> SyntectParser<'a> { impl<'a> SyntectParser<'a> {
pub fn new(syntax_set: SyntaxSet, theme_set: ThemeSet, theme: &'a str) -> Self { pub fn new<S: Into<MaybeOwned<'a, SyntaxSet>>, T: Into<MaybeOwned<'a, ThemeSet>>>(
syntax_set: S,
theme_set: T,
theme: &'a str,
) -> Self {
Self { Self {
syntax_set, syntax_set: syntax_set.into(),
theme_set, theme_set: theme_set.into(),
theme, theme,
} }
} }
@ -38,11 +70,11 @@ impl<'a> SyntectParser<'a> {
impl<'a> Default for SyntectParser<'a> { impl<'a> Default for SyntectParser<'a> {
fn default() -> Self { fn default() -> Self {
Self { Self::new(
syntax_set: SyntaxSet::load_defaults_newlines(), SyntaxSet::load_defaults_newlines(),
theme_set: ThemeSet::load_defaults(), ThemeSet::load_defaults(),
theme: "base16-ocean.dark", "base16-ocean.dark",
} )
} }
} }