pub mod fixture;
pub mod index;
pub(crate) mod format;
pub use fixture::Fixture;
pub use index::EmbeddedThesaurus;
pub type WordId = u32;
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
pub enum Pos {
Noun,
Verb,
Adjective,
Adverb,
}
impl Pos {
pub fn from_code(code: &str) -> Option<Pos> {
match code {
"n" => Some(Pos::Noun),
"v" => Some(Pos::Verb),
"a" | "s" => Some(Pos::Adjective),
"r" => Some(Pos::Adverb),
_ => None,
}
}
pub fn tag(self) -> u8 {
match self {
Pos::Noun => 0,
Pos::Verb => 1,
Pos::Adjective => 2,
Pos::Adverb => 3,
}
}
pub fn from_tag(tag: u8) -> Option<Pos> {
match tag {
0 => Some(Pos::Noun),
1 => Some(Pos::Verb),
2 => Some(Pos::Adjective),
3 => Some(Pos::Adverb),
_ => None,
}
}
pub fn label(self) -> &'static str {
match self {
Pos::Noun => "noun",
Pos::Verb => "verb",
Pos::Adjective => "adjective",
Pos::Adverb => "adverb",
}
}
pub fn order(self) -> u8 {
self.tag()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Link {
pub word: WordId,
pub lemma: String,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RelatedGroup {
pub label: &'static str,
pub links: Vec<Link>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SenseView {
pub pos: Pos,
pub definition: String,
pub examples: Vec<String>,
pub synonyms: Vec<Link>,
pub antonyms: Vec<Link>,
pub related: Vec<RelatedGroup>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Entry {
pub word: WordId,
pub lemma: String,
pub senses: Vec<SenseView>,
}
pub trait Thesaurus {
fn search_prefix(&self, prefix: &str, limit: usize) -> Vec<WordId>;
fn lookup(&self, lemma: &str) -> Option<WordId>;
fn lemma(&self, word: WordId) -> Option<&str>;
fn entry(&self, word: WordId) -> Option<Entry>;
fn word_count(&self) -> usize;
fn word_at(&self, index: usize) -> Option<WordId>;
}