essentia_core/data/
constraints.rs

1use crate::data::types::{DataType, HasDataType, phantom};
2
3pub trait ParameterData: HasDataType {}
4
5pub trait InputOutputData: HasDataType {}
6
7pub trait PoolData: HasDataType {}
8
9pub trait ValidateConstraint<T> {
10    const IS_VALID: bool;
11
12    fn validate() -> Result<(), &'static str> {
13        if Self::IS_VALID {
14            Ok(())
15        } else {
16            Err("Type constraint violation")
17        }
18    }
19}
20
21impl ParameterData for phantom::Float {}
22impl ParameterData for phantom::String {}
23impl ParameterData for phantom::Bool {}
24impl ParameterData for phantom::Int {}
25impl ParameterData for phantom::StereoSample {}
26impl ParameterData for phantom::VectorFloat {}
27impl ParameterData for phantom::VectorString {}
28impl ParameterData for phantom::VectorBool {}
29impl ParameterData for phantom::VectorInt {}
30impl ParameterData for phantom::VectorStereoSample {}
31impl ParameterData for phantom::VectorVectorFloat {}
32impl ParameterData for phantom::VectorVectorString {}
33impl ParameterData for phantom::VectorVectorStereoSample {}
34impl ParameterData for phantom::VectorMatrixFloat {}
35impl ParameterData for phantom::MapVectorFloat {}
36impl ParameterData for phantom::MapVectorString {}
37impl ParameterData for phantom::MapVectorInt {}
38impl ParameterData for phantom::MapFloat {}
39impl ParameterData for phantom::MatrixFloat {}
40
41impl InputOutputData for phantom::Float {}
42impl InputOutputData for phantom::UnsignedInt {}
43impl InputOutputData for phantom::Long {}
44impl InputOutputData for phantom::String {}
45impl InputOutputData for phantom::Bool {}
46impl InputOutputData for phantom::Int {}
47impl InputOutputData for phantom::StereoSample {}
48impl InputOutputData for phantom::Complex {}
49impl InputOutputData for phantom::TensorFloat {}
50impl InputOutputData for phantom::VectorFloat {}
51impl InputOutputData for phantom::VectorString {}
52impl InputOutputData for phantom::VectorBool {}
53impl InputOutputData for phantom::VectorInt {}
54impl InputOutputData for phantom::VectorStereoSample {}
55impl InputOutputData for phantom::VectorComplex {}
56impl InputOutputData for phantom::VectorVectorFloat {}
57impl InputOutputData for phantom::VectorVectorString {}
58impl InputOutputData for phantom::VectorVectorStereoSample {}
59impl InputOutputData for phantom::VectorVectorComplex {}
60impl InputOutputData for phantom::VectorMatrixFloat {}
61impl InputOutputData for phantom::MapVectorFloat {}
62impl InputOutputData for phantom::MapVectorString {}
63impl InputOutputData for phantom::MapVectorInt {}
64impl InputOutputData for phantom::MapVectorComplex {}
65impl InputOutputData for phantom::MapFloat {}
66impl InputOutputData for phantom::MatrixFloat {}
67impl InputOutputData for phantom::Pool {}
68
69impl PoolData for phantom::Float {}
70impl PoolData for phantom::String {}
71impl PoolData for phantom::StereoSample {}
72impl PoolData for phantom::VectorFloat {}
73impl PoolData for phantom::VectorString {}
74impl PoolData for phantom::VectorStereoSample {}
75impl PoolData for phantom::TensorFloat {}
76
77pub struct ParameterConstraint<T>(std::marker::PhantomData<T>);
78
79impl<T: ParameterData> ValidateConstraint<T> for ParameterConstraint<T> {
80    const IS_VALID: bool = true;
81}
82
83pub struct InputOutputConstraint<T>(std::marker::PhantomData<T>);
84
85impl<T: InputOutputData> ValidateConstraint<T> for InputOutputConstraint<T> {
86    const IS_VALID: bool = true;
87}
88
89pub struct PoolConstraint<T>(std::marker::PhantomData<T>);
90
91impl<T: PoolData> ValidateConstraint<T> for PoolConstraint<T> {
92    const IS_VALID: bool = true;
93}
94
95pub const fn is_valid_parameter_type(data_type: DataType) -> bool {
96    matches!(
97        data_type,
98        DataType::Float
99            | DataType::String
100            | DataType::Bool
101            | DataType::Int
102            | DataType::StereoSample
103            | DataType::VectorFloat
104            | DataType::VectorString
105            | DataType::VectorBool
106            | DataType::VectorInt
107            | DataType::VectorStereoSample
108            | DataType::VectorVectorFloat
109            | DataType::VectorVectorString
110            | DataType::VectorVectorStereoSample
111            | DataType::VectorMatrixFloat
112            | DataType::MapVectorFloat
113            | DataType::MapVectorString
114            | DataType::MapVectorInt
115            | DataType::MapFloat
116            | DataType::MatrixFloat
117    )
118}
119
120pub const fn is_valid_input_output_type(data_type: DataType) -> bool {
121    matches!(
122        data_type,
123        DataType::Float
124            | DataType::UnsignedInt
125            | DataType::Long
126            | DataType::String
127            | DataType::Bool
128            | DataType::Int
129            | DataType::StereoSample
130            | DataType::Complex
131            | DataType::TensorFloat
132            | DataType::VectorFloat
133            | DataType::VectorString
134            | DataType::VectorBool
135            | DataType::VectorInt
136            | DataType::VectorStereoSample
137            | DataType::VectorComplex
138            | DataType::VectorVectorFloat
139            | DataType::VectorVectorString
140            | DataType::VectorVectorStereoSample
141            | DataType::VectorVectorComplex
142            | DataType::VectorMatrixFloat
143            | DataType::MapVectorFloat
144            | DataType::MapVectorString
145            | DataType::MapVectorInt
146            | DataType::MapVectorComplex
147            | DataType::MapFloat
148            | DataType::MatrixFloat
149            | DataType::Pool
150    )
151}
152
153pub const fn is_valid_pool_type(data_type: DataType) -> bool {
154    matches!(
155        data_type,
156        DataType::Float
157            | DataType::String
158            | DataType::StereoSample
159            | DataType::VectorFloat
160            | DataType::VectorString
161            | DataType::VectorStereoSample
162            | DataType::TensorFloat
163    )
164}