in highlight/src/lib.rs [261:361]
fn new(json: PropertiesJSON, language: Language) -> Result<Self, String> {
let injections = match (json.injection_language, json.injection_content) {
(None, None) => Ok(Vec::new()),
(Some(_), None) => Err(
"Must specify an injection-content along with an injection-language".to_string(),
),
(None, Some(_)) => Err(
"Must specify an injection-language along with an injection-content".to_string(),
),
(Some(language_json), Some(content_json)) => {
let languages = match language_json {
InjectionLanguageJSON::List(list) => {
let mut result = Vec::with_capacity(list.len());
for element in list {
result.push(match element {
InjectionLanguageJSON::TreePath(p) => {
let mut result = Vec::new();
Self::flatten_tree_path(p, &mut result, language)?;
InjectionLanguage::TreePath(result)
}
InjectionLanguageJSON::Literal(s) => InjectionLanguage::Literal(s),
InjectionLanguageJSON::List(_) => {
panic!("Injection-language cannot be a list of lists")
}
})
}
result
}
InjectionLanguageJSON::TreePath(p) => vec![{
let mut result = Vec::new();
Self::flatten_tree_path(p, &mut result, language)?;
InjectionLanguage::TreePath(result)
}],
InjectionLanguageJSON::Literal(s) => vec![InjectionLanguage::Literal(s)],
};
let contents = match content_json {
InjectionContentJSON::List(l) => {
let mut result = Vec::with_capacity(l.len());
for element in l {
result.push(match element {
InjectionContentJSON::TreePath(p) => {
let mut result = Vec::new();
Self::flatten_tree_path(p, &mut result, language)?;
result
}
InjectionContentJSON::List(_) => {
panic!("Injection-content cannot be a list of lists")
}
})
}
result
}
InjectionContentJSON::TreePath(p) => vec![{
let mut result = Vec::new();
Self::flatten_tree_path(p, &mut result, language)?;
result
}],
};
let mut includes_children = match json.injection_includes_children {
Some(InjectionIncludesChildrenJSON::List(v)) => v,
Some(InjectionIncludesChildrenJSON::Single(v)) => vec![v],
None => vec![false],
};
if languages.len() == contents.len() {
includes_children.resize(languages.len(), includes_children[0]);
Ok(languages
.into_iter()
.zip(contents.into_iter())
.zip(includes_children.into_iter())
.map(|((language, content), includes_children)| Injection {
language,
content,
includes_children,
})
.collect())
} else {
Err(format!(
"Mismatch: got {} injection-language values but {} injection-content values",
languages.len(),
contents.len(),
))
}
}
}?;
Ok(Self {
highlight: json.highlight,
highlight_nonlocal: json.highlight_nonlocal,
local_scope: if json.local_scope {
Some(json.local_scope_inherit)
} else {
None
},
local_definition: json.local_definition,
local_reference: json.local_reference,
injections,
})
}