#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum EmitContext {
OptionsModule,
#[allow(dead_code)]
NativeStub,
}
#[derive(Debug, Clone, Copy)]
pub(super) enum Wrapping {
Plain,
Optional,
Vec,
OptionalVec,
}
pub(crate) fn sanitize_python_doc(s: &str) -> String {
s.replace('\u{2013}', "-") .replace('\u{2014}', "--") .replace('\u{00D7}', "x") .replace(['\u{2019}', '\u{2018}'], "'") .replace(['\u{201C}', '\u{201D}'], "\"") }
pub(crate) fn class_name_to_docstring(name: &str) -> String {
use heck::ToSnakeCase;
let snake = name.to_snake_case();
let sentence = snake.replace('_', " ");
let mut chars = sentence.chars();
let capitalized = match chars.next() {
None => String::new(),
Some(first) => first.to_uppercase().collect::<String>() + chars.as_str(),
};
format!("{}.", capitalized)
}
#[cfg(test)]
mod tests {
use super::{EmitContext, Wrapping, class_name_to_docstring, sanitize_python_doc};
#[test]
fn sanitize_python_doc_replaces_en_dash() {
let input = "foo \u{2013} bar";
assert_eq!(sanitize_python_doc(input), "foo - bar");
}
#[test]
fn sanitize_python_doc_replaces_em_dash() {
let input = "foo \u{2014} bar";
assert_eq!(sanitize_python_doc(input), "foo -- bar");
}
#[test]
fn class_name_to_docstring_converts_camel_case() {
assert_eq!(class_name_to_docstring("AuthenticationError"), "Authentication error.");
}
#[test]
fn emit_context_variants_are_distinct() {
assert_ne!(EmitContext::OptionsModule, EmitContext::NativeStub);
}
#[test]
fn wrapping_plain_is_copy() {
let w = Wrapping::Plain;
let _w2 = w;
let _w3 = w;
}
}