1use tantivy::schema::{Field, Schema};
2
3use crate::errors::{Error, SummaResult, ValidationError};
4
5pub fn parse_schema(schema: &str) -> SummaResult<Schema> {
6 serde_yaml::from_str(schema).map_err(|_| Error::Validation(Box::new(ValidationError::InvalidSchema(schema.to_owned()))))
7}
8
9pub fn parse_fields<'a>(schema: &'a Schema, fields: &'a [String], excluded_fields: &'a [String]) -> SummaResult<Vec<(Field, &'a str)>> {
10 if excluded_fields.is_empty() {
11 Ok(fields
12 .iter()
13 .map(|f| schema.find_field(f).ok_or_else(|| ValidationError::MissingField(f.to_string())))
14 .collect::<Result<_, _>>()?)
15 } else if fields.is_empty() {
16 Ok(schema
17 .fields()
18 .filter_map(|(_, field_entry)| {
19 if excluded_fields.iter().any(|e| e == field_entry.name()) {
20 None
21 } else {
22 Some(
23 schema
24 .find_field(field_entry.name())
25 .ok_or_else(|| ValidationError::MissingField(field_entry.name().to_string())),
26 )
27 }
28 })
29 .collect::<Result<_, _>>()?)
30 } else {
31 Ok(fields
32 .iter()
33 .map(|f| schema.find_field(f).ok_or_else(|| ValidationError::MissingField(f.to_string())))
34 .collect::<Result<_, _>>()?)
35 }
36}