use crate::corpusstorage::QueryLanguage;
use std::collections::BTreeMap;
#[derive(Debug, Default, Clone, Serialize)]
#[repr(C)]
pub struct CountExtra {
pub match_count: u64,
pub document_count: u64,
}
pub type FrequencyTable<T> = Vec<FrequencyTableRow<T>>;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct FrequencyTableRow<T> {
pub values: Vec<T>,
pub count: usize,
}
#[derive(Serialize)]
pub struct QueryAttributeDescription {
pub alternative: usize,
pub query_fragment: String,
pub variable: String,
pub anno_name: Option<String>,
pub optional: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)]
pub struct LineColumn {
pub line: usize,
pub column: usize,
}
impl std::fmt::Display for LineColumn {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}:{}", self.line, self.column)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)]
pub struct LineColumnRange {
pub start: LineColumn,
pub end: Option<LineColumn>,
}
impl std::fmt::Display for LineColumnRange {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
if let Some(end) = self.end.clone() {
if self.start == end {
write!(f, "{}", self.start)
} else {
write!(f, "{}-{}", self.start, end)
}
} else {
write!(f, "{}", self.start)
}
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct CorpusConfiguration {
#[serde(default)]
pub context: ContextConfiguration,
#[serde(default)]
pub view: ViewConfiguration,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub example_queries: Vec<ExampleQuery>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub visualizers: Vec<VisualizerRule>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ContextConfiguration {
pub default: usize,
pub sizes: Vec<usize>,
pub max: Option<usize>,
pub segmentation: Option<String>,
}
impl Default for ContextConfiguration {
fn default() -> Self {
ContextConfiguration {
default: 5,
segmentation: None,
max: None,
sizes: vec![0, 1, 2, 5, 10],
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(tag = "strategy")]
pub enum TimelineStrategy {
Explicit,
ImplicitFromNamespace,
ImplicitFromMapping { mappings: BTreeMap<String, String> },
}
impl TimelineStrategy {
pub fn is_explicit(&self) -> bool {
self == &TimelineStrategy::Explicit
}
}
impl Default for TimelineStrategy {
fn default() -> Self {
TimelineStrategy::Explicit
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ViewConfiguration {
pub base_text_segmentation: Option<String>,
pub page_size: usize,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub hidden_annos: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub corpus_annotation_order: Vec<String>,
#[serde(default, skip_serializing_if = "TimelineStrategy::is_explicit")]
pub timeline_strategy: TimelineStrategy,
}
impl Default for ViewConfiguration {
fn default() -> Self {
ViewConfiguration {
base_text_segmentation: None,
page_size: 10,
hidden_annos: Vec::default(),
corpus_annotation_order: Vec::default(),
timeline_strategy: TimelineStrategy::Explicit,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExampleQuery {
pub query: String,
pub description: String,
pub query_language: QueryLanguage,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct VisualizerRule {
pub element: Option<VisualizerRuleElement>,
pub layer: Option<String>,
pub vis_type: String,
pub display_name: String,
#[serde(default)]
pub visibility: VisualizerVisibility,
#[serde(
default,
serialize_with = "toml::ser::tables_last",
skip_serializing_if = "BTreeMap::is_empty"
)]
pub mappings: BTreeMap<String, String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub enum VisualizerVisibility {
#[serde(rename = "hidden")]
Hidden,
#[serde(rename = "visible")]
Visible,
#[serde(rename = "permanent")]
Permanent,
#[serde(rename = "preloaded")]
Preloaded,
}
impl Default for VisualizerVisibility {
fn default() -> Self {
VisualizerVisibility::Hidden
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub enum VisualizerRuleElement {
#[serde(rename = "node")]
Node,
#[serde(rename = "edge")]
Edge,
}