Skip to content

Commit

Permalink
Be better about traversing available options
Browse files Browse the repository at this point in the history
  • Loading branch information
gjtorikian committed Nov 11, 2022
1 parent 57f83a9 commit 8b99ddd
Showing 1 changed file with 82 additions and 65 deletions.
147 changes: 82 additions & 65 deletions ext/commonmarker/src/comrak_options.rs
Original file line number Diff line number Diff line change
@@ -1,94 +1,111 @@
use std::borrow::Cow;

use comrak::ComrakOptions;

use magnus::{class, r_hash::ForEach, Error, RHash, Symbol, Value};

const PARSE_SMART: &str = "smart";
const PARSE_DEFAULT_INFO_STRING: &str = "default_info_string";

fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
options_hash
.foreach(|key: Symbol, value: Value| {
if key.name().unwrap() == "smart" {
comrak_options.parse.smart = value.try_convert::<bool>()?;
}
if key.name().unwrap() == "default_info_string" {
comrak_options.parse.default_info_string =
Some(value.try_convert::<String>().unwrap());
match key.name() {
Ok(Cow::Borrowed(PARSE_SMART)) => {
comrak_options.parse.smart = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(PARSE_DEFAULT_INFO_STRING)) => {
comrak_options.parse.default_info_string =
Some(value.try_convert::<String>().unwrap());
}
_ => {}
}
Ok(ForEach::Continue)
})
.unwrap();
}

const RENDER_HARDBREAKS: &str = "hardbreaks";
const RENDER_GITHUB_PRE_LANG: &str = "github_pre_lang";
const RENDER_WIDTH: &str = "width";
const RENDER_UNSAFE: &str = "unsafe_";
const RENDER_ESCAPE: &str = "escape";

fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
options_hash
.foreach(|key: Symbol, value: Value| {
if key.name().unwrap() == "hardbreaks" {
comrak_options.render.hardbreaks = value.try_convert::<bool>()?;
match key.name() {
Ok(Cow::Borrowed(RENDER_HARDBREAKS)) => {
comrak_options.render.hardbreaks = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(RENDER_GITHUB_PRE_LANG)) => {
comrak_options.render.github_pre_lang = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(RENDER_WIDTH)) => {
comrak_options.render.width = value.try_convert::<usize>()?;
}
Ok(Cow::Borrowed(RENDER_UNSAFE)) => {
comrak_options.render.unsafe_ = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(RENDER_ESCAPE)) => {
comrak_options.render.escape = value.try_convert::<bool>()?;
}
_ => {}
}

if key.name().unwrap() == "github_pre_lang" {
comrak_options.render.github_pre_lang = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "width" {
comrak_options.render.width = value.try_convert::<usize>()?;
}

if key.name().unwrap() == "unsafe_" {
comrak_options.render.unsafe_ = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "escape" {
comrak_options.render.escape = value.try_convert::<bool>()?;
}

Ok(ForEach::Continue)
})
.unwrap();
}

const EXTENSION_STRIKETHROUGH: &str = "strikethrough";
const EXTENSION_TAGFILTER: &str = "tagfilter";
const EXTENSION_TABLE: &str = "table";
const EXTENSION_AUTOLINK: &str = "autolink";
const EXTENSION_TASKLIST: &str = "tasklist";
const EXTENSION_SUPERSCRIPT: &str = "superscript";
const EXTENSION_HEADER_IDS: &str = "header_ids";
const EXTENSION_FOOTNOTES: &str = "footnotes";
const EXTENSION_DESCRIPTION_LISTS: &str = "description_lists";
const EXTENSION_FRONT_MATTER_DELIMITER: &str = "front_matter_delimiter";

fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
options_hash
.foreach(|key: Symbol, value: Value| {
if key.name().unwrap() == "strikethrough" {
comrak_options.extension.strikethrough = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "tagfilter" {
comrak_options.extension.tagfilter = value.try_convert::<bool>()?;
match key.name() {
Ok(Cow::Borrowed(EXTENSION_STRIKETHROUGH)) => {
comrak_options.extension.strikethrough = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_TAGFILTER)) => {
comrak_options.extension.tagfilter = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_TABLE)) => {
comrak_options.extension.table = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_AUTOLINK)) => {
comrak_options.extension.autolink = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_TASKLIST)) => {
comrak_options.extension.tasklist = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_SUPERSCRIPT)) => {
comrak_options.extension.superscript = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_HEADER_IDS)) => {
comrak_options.extension.header_ids =
Some(value.try_convert::<String>().unwrap());
}
Ok(Cow::Borrowed(EXTENSION_FOOTNOTES)) => {
comrak_options.extension.footnotes = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_DESCRIPTION_LISTS)) => {
comrak_options.extension.description_lists = value.try_convert::<bool>()?;
}
Ok(Cow::Borrowed(EXTENSION_FRONT_MATTER_DELIMITER)) => {
comrak_options.extension.front_matter_delimiter =
Some(value.try_convert::<String>().unwrap());
}
_ => {}
}

if key.name().unwrap() == "table" {
comrak_options.extension.table = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "autolink" {
comrak_options.extension.autolink = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "tasklist" {
comrak_options.extension.tasklist = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "superscript" {
comrak_options.extension.superscript = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "header_ids" {
comrak_options.extension.header_ids = Some(value.try_convert::<String>().unwrap());
}

if key.name().unwrap() == "footnotes" {
comrak_options.extension.footnotes = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "description_lists" {
comrak_options.extension.description_lists = value.try_convert::<bool>()?;
}

if key.name().unwrap() == "front_matter_delimiter" {
comrak_options.extension.front_matter_delimiter =
Some(value.try_convert::<String>().unwrap());
}

Ok(ForEach::Continue)
})
.unwrap();
Expand Down

0 comments on commit 8b99ddd

Please sign in to comment.