use std::path::PathBuf;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Layout {
#[default]
Package,
Entity,
Split,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum EscapeTags {
#[default]
Off,
Backticks,
Entities,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OpenApiSummaryLabel {
#[default]
Endpoint,
Summary,
Prefixed,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OpenApiOperationSource {
#[default]
Collapsed,
Trimmed,
Hidden,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Options {
pub init: bool,
pub summary: bool,
pub book_root: String,
pub markdown_root: String,
pub summary_path: String,
pub book: Option<String>,
pub mdbook_out: Option<String>,
pub title: Option<String>,
pub ignore_git: bool,
pub layout: Layout,
pub search_paths: Vec<PathBuf>,
pub escape_tags: EscapeTags,
pub link_format: Option<String>,
pub no_proto_markdown: bool,
pub no_proto_highlight: bool,
pub no_cel_highlight: bool,
pub explicit_markdown_root: bool,
pub explicit_summary_path: bool,
pub explicit_book_root: bool,
pub alphabetize_services: bool,
pub alphabetize_messages: bool,
pub openapi_operation_source: OpenApiOperationSource,
pub openapi_summary_label: OpenApiSummaryLabel,
}
impl Default for Options {
fn default() -> Self {
Self {
init: false,
summary: false,
book_root: ".".into(),
markdown_root: "src/packages".into(),
summary_path: "src/SUMMARY.md".into(),
book: None,
mdbook_out: None,
title: None,
ignore_git: true,
layout: Layout::default(),
search_paths: Vec::new(),
escape_tags: EscapeTags::default(),
link_format: None,
no_proto_markdown: false,
no_proto_highlight: false,
no_cel_highlight: false,
explicit_markdown_root: false,
explicit_summary_path: false,
explicit_book_root: false,
alphabetize_services: false,
alphabetize_messages: false,
openapi_operation_source: OpenApiOperationSource::default(),
openapi_summary_label: OpenApiSummaryLabel::default(),
}
}
}
impl Options {
pub fn link_format_name(&self) -> &str {
self.link_format.as_deref().unwrap_or("mdbook-relative")
}
pub fn output_path(&self, rel: &str) -> String {
let rel = rel.trim_start_matches('/');
if self.book_root == "." || self.book_root.is_empty() {
rel.to_string()
} else {
format!("{}/{rel}", self.book_root.trim_end_matches('/'))
}
}
pub fn proto_highlight(&self) -> bool {
self.init && !self.no_proto_highlight
}
pub fn cel_highlight(&self) -> bool {
self.init && !self.no_cel_highlight
}
pub fn render_summary(&self) -> bool {
self.summary || self.init
}
pub fn package_only_summary(&self) -> bool {
self.init && matches!(self.layout, Layout::Package)
}
}