diff --git a/src/xatu/parser.rs b/src/xatu/parser.rs index 4f8490b..581e19a 100644 --- a/src/xatu/parser.rs +++ b/src/xatu/parser.rs @@ -61,7 +61,7 @@ fn convert_node(node: rnix::SyntaxNode) -> Option { fn convert_apply(node: rnix::SyntaxNode) -> Option { let apply = rnix::ast::Apply::cast(node)?; let range = apply.syntax().text_range().into(); - let data = convert_apply_data(apply)?; + let data = apply.try_into().ok()?; Some(ast::Node { range, @@ -74,49 +74,66 @@ fn convert_inherit(node: rnix::SyntaxNode) -> Option { Some(ast::Node { range: inherit.syntax().text_range().into(), - data: ast::NodeData::Inherit(convert_inherit_data(inherit)), + data: ast::NodeData::Inherit(inherit.into()), }) } -fn convert_apply_data(apply: rnix::ast::Apply) -> Option { - Some(ast::Apply { - function: convert_expr(apply.lambda()?)?, - }) -} +impl TryFrom for ast::Apply { + type Error = (); -fn convert_expr(expr: rnix::ast::Expr) -> Option { - match expr { - rnix::ast::Expr::Ident(ident) => Some(ast::Expr::Ident(convert_ident(ident)?)), - rnix::ast::Expr::Select(select) => { - Some(ast::Expr::Select(Box::new(convert_select(select)?))) - } - _ => None, + fn try_from(apply: rnix::ast::Apply) -> Result { + Ok(Self { + function: apply.lambda().ok_or(())?.try_into()?, + }) } } -fn convert_ident(ident: rnix::ast::Ident) -> Option { - Some(ast::Ident { - name: ident.ident_token()?.text().to_owned(), - }) +impl TryFrom for ast::Expr { + type Error = (); + + fn try_from(expr: rnix::ast::Expr) -> Result { + match expr { + rnix::ast::Expr::Ident(ident) => Ok(Self::Ident(ident.try_into()?)), + rnix::ast::Expr::Select(select) => Ok(Self::Select(Box::new(select.try_into()?))), + _ => Err(()), + } + } } -fn convert_select(select: rnix::ast::Select) -> Option { - Some(ast::Select { - receiver: convert_expr(select.expr()?)?, - attrs: select - .attrpath()? - .attrs() - .map(|attr| match attr { - rnix::ast::Attr::Ident(ident) => convert_ident(ident), - _ => None, - }) - .collect::>>()?, - }) +impl TryFrom for ast::Ident { + type Error = (); + + fn try_from(ident: rnix::ast::Ident) -> Result { + Ok(Self { + name: ident.ident_token().ok_or(())?.text().to_owned(), + }) + } } -fn convert_inherit_data(inherit: rnix::ast::Inherit) -> ast::Inherit { - ast::Inherit { - attr_count: inherit.attrs().count(), +impl TryFrom for ast::Select { + type Error = (); + + fn try_from(select: rnix::ast::Select) -> Result { + Ok(Self { + receiver: select.expr().ok_or(())?.try_into()?, + attrs: select + .attrpath() + .ok_or(())? + .attrs() + .map(|attr| match attr { + rnix::ast::Attr::Ident(ident) => ident.try_into(), + _ => Err(()), + }) + .collect::, _>>()?, + }) + } +} + +impl From for ast::Inherit { + fn from(inherit: rnix::ast::Inherit) -> Self { + Self { + attr_count: inherit.attrs().count(), + } } }