use std::io::Write;
use syn;
use crate::bindgen::config::{Config, DocumentationStyle};
use crate::bindgen::utilities::SynAttributeHelpers;
use crate::bindgen::writer::{Source, SourceWriter};
#[derive(Debug, Clone)]
pub struct Documentation {
pub doc_comment: Vec<String>,
}
impl Documentation {
pub fn load(attrs: &[syn::Attribute]) -> Self {
let doc = attrs
.get_comment_lines()
.into_iter()
.filter(|x| !x.trim_start().starts_with("cbindgen:"))
.collect();
Documentation { doc_comment: doc }
}
pub fn none() -> Self {
Documentation {
doc_comment: Vec::new(),
}
}
}
impl Source for Documentation {
fn write<F: Write>(&self, config: &Config, out: &mut SourceWriter<F>) {
if self.doc_comment.is_empty() || !config.documentation {
return;
}
let style = match config.documentation_style {
DocumentationStyle::Auto => DocumentationStyle::C, other => other,
};
match style {
DocumentationStyle::C => {
out.write("#");
}
DocumentationStyle::Doxy => {
out.write("##");
}
_ => (),
}
for line in &self.doc_comment {
match style {
DocumentationStyle::C => out.write("#"),
DocumentationStyle::Doxy => out.write("# *"),
DocumentationStyle::C99 => out.write("#"),
DocumentationStyle::Cxx => out.write("##"),
DocumentationStyle::Auto => unreachable!(), }
write!(out, "{}", line);
out.new_line();
}
match style {
_ => (),
}
}
}