From f19654619d2f945bc839598bd7a5fcaad08958b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Borgna?= <121866228+aborgna-q@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:11:18 +0100 Subject: [PATCH] Add a blanket implementation for CustomSigFn (#259) * Add a blanket implementation for CustomSigFn * Use a closure in the rotation resource def This should appease the coverage checker * Re-add name and misc parameters --- src/extensions/rotation.rs | 46 +++++++++++++------------------------- src/resource.rs | 14 ++++++++++++ 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/extensions/rotation.rs b/src/extensions/rotation.rs index c49f15153..8bcd20c15 100644 --- a/src/extensions/rotation.rs +++ b/src/extensions/rotation.rs @@ -12,8 +12,9 @@ use std::collections::HashMap; use pyo3::prelude::*; use crate::ops::constant::CustomConst; -use crate::resource::{CustomSignatureFunc, OpDef, ResourceSet, SignatureError, TypeDef}; -use crate::types::{type_param::TypeArg, ClassicType, CustomType, SimpleType, TypeRow}; +use crate::resource::{OpDef, ResourceSet, TypeDef}; +use crate::types::type_param::TypeArg; +use crate::types::{ClassicType, CustomType, SimpleType, TypeRow}; use crate::Resource; pub const fn resource_id() -> SmolStr { @@ -27,15 +28,18 @@ pub fn resource() -> Resource { resource.add_type(Type::Angle.type_def()); resource.add_type(Type::Quaternion.type_def()); - resource - .add_op(OpDef::new_with_custom_sig( - "AngleAdd".into(), - "".into(), - vec![], - HashMap::default(), - AngleAdd, - )) - .unwrap(); + let op = OpDef::new_with_custom_sig( + "AngleAdd".into(), + "".into(), + vec![], + HashMap::default(), + |_arg_values: &[TypeArg]| { + let t: TypeRow = vec![SimpleType::Classic(Type::Angle.custom_type().into())].into(); + Ok((t.clone(), t, ResourceSet::default())) + }, + ); + + resource.add_op(op).unwrap(); resource } @@ -98,26 +102,6 @@ impl CustomConst for Constant { } } -#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -pub struct AngleAdd; - -/// When we have a YAML type-scheme interpreter, we'll be able to use that; -/// there is no need for a binary compute_signature for a case this simple. -impl CustomSignatureFunc for AngleAdd { - fn compute_signature( - &self, - _name: &SmolStr, - _arg_values: &[TypeArg], - _misc: &HashMap, - ) -> Result<(TypeRow, TypeRow, ResourceSet), SignatureError> { - let t: TypeRow = vec![SimpleType::Classic( - Into::::into(Type::Angle).into(), - )] - .into(); - Ok((t.clone(), t, ResourceSet::default())) - } -} - // // TODO: // diff --git a/src/resource.rs b/src/resource.rs index deb279c95..7657ea9d1 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -44,6 +44,20 @@ pub trait CustomSignatureFunc: Send + Sync { } } +impl CustomSignatureFunc for F +where + F: Fn(&[TypeArg]) -> Result<(TypeRow, TypeRow, ResourceSet), SignatureError> + Send + Sync, +{ + fn compute_signature( + &self, + _name: &SmolStr, + arg_values: &[TypeArg], + _misc: &HashMap, + ) -> Result<(TypeRow, TypeRow, ResourceSet), SignatureError> { + self(arg_values) + } +} + /// An error that can occur in computing the signature of a node. /// TODO: decide on failure modes #[derive(Debug, Clone, Error, PartialEq, Eq)]