This commit is contained in:
@@ -4,12 +4,13 @@ use std::pin::Pin;
|
||||
use dyn_clone::DynClone;
|
||||
use never::Never;
|
||||
use orchid_base::error::{OrcErrv, OrcRes, mk_errv};
|
||||
use orchid_base::format::{Format, fmt};
|
||||
use orchid_base::interner::is;
|
||||
use orchid_base::location::Pos;
|
||||
use trait_set::trait_set;
|
||||
|
||||
use crate::atom::{AtomicFeatures, ForeignAtom, TAtom, ToAtom};
|
||||
use crate::expr::Expr;
|
||||
use crate::expr::{Expr, ExprKind};
|
||||
use crate::gen_expr::{GExpr, atom, bot};
|
||||
|
||||
pub trait TryFromExpr: Sized {
|
||||
@@ -26,14 +27,17 @@ impl<T: TryFromExpr, U: TryFromExpr> TryFromExpr for (T, U) {
|
||||
}
|
||||
}
|
||||
|
||||
async fn err_not_atom(pos: Pos) -> OrcErrv {
|
||||
mk_errv(is("Expected an atom").await, "This expression is not an atom", [pos])
|
||||
async fn err_not_atom(pos: Pos, value: &impl Format) -> OrcErrv {
|
||||
mk_errv(is("Expected an atom").await, format!("{} is not an atom", fmt(value).await), [pos])
|
||||
}
|
||||
|
||||
impl TryFromExpr for ForeignAtom {
|
||||
async fn try_from_expr(expr: Expr) -> OrcRes<Self> {
|
||||
match expr.atom().await {
|
||||
Err(ex) => Err(err_not_atom(ex.data().await.pos.clone()).await),
|
||||
if let ExprKind::Bottom(err) = &expr.data().await.kind {
|
||||
return Err(err.clone());
|
||||
}
|
||||
match expr.clone().atom().await {
|
||||
Err(ex) => Err(err_not_atom(ex.data().await.pos.clone(), &expr).await),
|
||||
Ok(f) => Ok(f),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user