@@ -20,8 +20,7 @@ class PyObjectStructField final : public DialectGenericStructField
20
20
public:
21
21
using BASE = DialectGenericStructField;
22
22
PyObjectStructField ( const std::string & name,
23
- PyTypeObjectPtr pytype,
24
- bool isOptional ) : BASE( name, sizeof ( PyObjectPtr ), alignof ( PyObjectPtr ), isOptional ),
23
+ PyTypeObjectPtr pytype ) : BASE( name, sizeof ( PyObjectPtr ), alignof ( PyObjectPtr ) ),
25
24
m_pytype ( pytype )
26
25
{}
27
26
@@ -120,9 +119,8 @@ static PyObject * PyStructMeta_new( PyTypeObject *subtype, PyObject *args, PyObj
120
119
if ( !keystr )
121
120
CSP_THROW ( PythonPassthrough, " " );
122
121
123
- if (!PySet_Check (optional_fields)) {
122
+ if (!PySet_Check (optional_fields))
124
123
CSP_THROW ( TypeError, " Struct metadata for key " << keystr << " expected a set, got " << PyObjectPtr::incref ( optional_fields ) );
125
- }
126
124
127
125
bool isOptional = PySet_Contains ( optional_fields, key ) == 1 ;
128
126
@@ -134,33 +132,36 @@ static PyObject * PyStructMeta_new( PyTypeObject *subtype, PyObject *args, PyObj
134
132
135
133
switch ( csptype -> type () )
136
134
{
137
- case csp::CspType::Type::BOOL: field = std::make_shared<BoolStructField>( keystr, isOptional ); break ;
138
- case csp::CspType::Type::INT64: field = std::make_shared<Int64StructField>( keystr, isOptional ); break ;
139
- case csp::CspType::Type::DOUBLE: field = std::make_shared<DoubleStructField>( keystr, isOptional ); break ;
140
- case csp::CspType::Type::DATETIME: field = std::make_shared<DateTimeStructField>( keystr, isOptional ); break ;
141
- case csp::CspType::Type::TIMEDELTA: field = std::make_shared<TimeDeltaStructField>( keystr, isOptional ); break ;
142
- case csp::CspType::Type::DATE: field = std::make_shared<DateStructField>( keystr, isOptional ); break ;
143
- case csp::CspType::Type::TIME: field = std::make_shared<TimeStructField>( keystr, isOptional ); break ;
144
- case csp::CspType::Type::STRING: field = std::make_shared<StringStructField>( csptype, keystr, isOptional ); break ;
145
- case csp::CspType::Type::ENUM: field = std::make_shared<CspEnumStructField>( csptype, keystr, isOptional ); break ;
146
- case csp::CspType::Type::STRUCT: field = std::make_shared<StructStructField>( csptype, keystr, isOptional ); break ;
135
+ case csp::CspType::Type::BOOL: field = std::make_shared<BoolStructField>( keystr ); break ;
136
+ case csp::CspType::Type::INT64: field = std::make_shared<Int64StructField>( keystr ); break ;
137
+ case csp::CspType::Type::DOUBLE: field = std::make_shared<DoubleStructField>( keystr ); break ;
138
+ case csp::CspType::Type::DATETIME: field = std::make_shared<DateTimeStructField>( keystr ); break ;
139
+ case csp::CspType::Type::TIMEDELTA: field = std::make_shared<TimeDeltaStructField>( keystr ); break ;
140
+ case csp::CspType::Type::DATE: field = std::make_shared<DateStructField>( keystr ); break ;
141
+ case csp::CspType::Type::TIME: field = std::make_shared<TimeStructField>( keystr ); break ;
142
+ case csp::CspType::Type::STRING: field = std::make_shared<StringStructField>( csptype, keystr ); break ;
143
+ case csp::CspType::Type::ENUM: field = std::make_shared<CspEnumStructField>( csptype, keystr ); break ;
144
+ case csp::CspType::Type::STRUCT: field = std::make_shared<StructStructField>( csptype, keystr ); break ;
147
145
case csp::CspType::Type::ARRAY:
148
146
{
149
147
const CspArrayType & arrayType = static_cast <const CspArrayType&>( *csptype );
150
- field = ArraySubTypeSwitch::invoke ( arrayType.elemType (), [csptype,keystr,isOptional ]( auto tag ) -> std::shared_ptr<StructField>
148
+ field = ArraySubTypeSwitch::invoke ( arrayType.elemType (), [csptype,keystr]( auto tag ) -> std::shared_ptr<StructField>
151
149
{
152
150
using CElemType = typename decltype (tag)::type;
153
151
using CType = typename CspType::Type::toCArrayType<CElemType>::type;
154
- return std::make_shared<ArrayStructField<CType>>( csptype, keystr, isOptional );
152
+ return std::make_shared<ArrayStructField<CType>>( csptype, keystr );
155
153
} );
156
154
157
155
break ;
158
156
}
159
157
160
- case csp::CspType::Type::DIALECT_GENERIC: field = std::make_shared<PyObjectStructField>( keystr, PyTypeObjectPtr::incref ( ( PyTypeObject * ) type ), isOptional ); break ;
158
+ case csp::CspType::Type::DIALECT_GENERIC: field = std::make_shared<PyObjectStructField>( keystr, PyTypeObjectPtr::incref ( ( PyTypeObject * ) type ) ); break ;
161
159
default :
162
160
CSP_THROW ( ValueError, " Unexpected csp type " << csptype -> type () << " on struct " << name );
163
161
}
162
+
163
+ if ( !isOptional )
164
+ field -> setRequired ( );
164
165
165
166
fields.emplace_back ( field );
166
167
}
@@ -362,31 +363,10 @@ static PyObject * PyStructMeta_metadata_info( PyStructMeta * m )
362
363
return out.release ();
363
364
}
364
365
365
- int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs, bool validate );
366
-
367
- static PyObject * PyStructMeta_unvalidated__call__ ( PyObject * self, PyObject * args, PyObject * kwargs )
368
- {
369
- CSP_BEGIN_METHOD;
370
- PyTypeObject * type = (PyTypeObject*)self;
371
-
372
- PyObject* instance = type->tp_new ( type, args, kwargs );
373
- if ( !instance )
374
- CSP_THROW ( PythonPassthrough, " " );
375
-
376
- if ( PyStruct_init ( (PyStruct*) instance, args, kwargs, false ) < 0 )
377
- {
378
- Py_DECREF ( instance );
379
- CSP_THROW ( PythonPassthrough, " " );
380
- }
381
-
382
- return instance;
383
- CSP_RETURN_NULL;
384
- }
385
366
386
367
static PyMethodDef PyStructMeta_methods[] = {
387
368
{" _layout" , (PyCFunction) PyStructMeta_layout, METH_NOARGS, " debug view of structs internal mem layout" },
388
369
{" _metadata_info" , (PyCFunction) PyStructMeta_metadata_info, METH_NOARGS, " provide detailed information about struct layout" },
389
- {" _unvalidated__call__" , (PyCFunction) PyStructMeta_unvalidated__call__, METH_VARARGS | METH_KEYWORDS, " create and initialize a struct without underlying validation" },
390
370
{NULL }
391
371
};
392
372
@@ -836,27 +816,16 @@ PyObject * PyStruct_validate( PyStruct * self ) {
836
816
CSP_RETURN_NONE;
837
817
}
838
818
839
- int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs, bool validate )
819
+ int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs )
840
820
{
841
821
CSP_BEGIN_METHOD;
842
822
843
823
PyStruct_setattrs ( self, args, kwargs, " __init__" );
844
- if ( validate )
845
- {
846
- PyObject * rv = PyStruct_validate ( self );
847
- if ( !rv )
848
- return -1 ;
849
- Py_DECREF ( rv );
850
- }
824
+ self -> struct_ -> validate ();
851
825
852
826
CSP_RETURN_INT;
853
827
}
854
828
855
- static int PyStruct_init_validated ( PyStruct * self, PyObject * args, PyObject * kwargs )
856
- {
857
- return PyStruct_init ( self, args, kwargs, true );
858
- }
859
-
860
829
PyObject * PyStruct_update ( PyStruct * self, PyObject * args, PyObject * kwargs )
861
830
{
862
831
CSP_BEGIN_METHOD;
@@ -1060,7 +1029,6 @@ static PyMethodDef PyStruct_methods[] = {
1060
1029
{ " update_from" , (PyCFunction) PyStruct_update_from, METH_O, " update from struct. struct must be same type or a derived type. unset fields will be not be copied" },
1061
1030
{ " update" , (PyCFunction) PyStruct_update, METH_VARARGS | METH_KEYWORDS, " update from key=val. given fields will be set on struct. other fields will remain as is in struct" },
1062
1031
{ " all_fields_set" , (PyCFunction) PyStruct_all_fields_set, METH_NOARGS, " return true if all fields on the struct are set" },
1063
- { " validate" , (PyCFunction) PyStruct_validate, METH_NOARGS, " validate the struct (strict struct fields set, etc...)" },
1064
1032
{ " to_dict" , (PyCFunction) PyStruct_to_dict, METH_VARARGS | METH_KEYWORDS, " return a python dict of the struct by recursively converting struct members into python dicts" },
1065
1033
{ " to_json" , (PyCFunction) PyStruct_to_json, METH_VARARGS | METH_KEYWORDS, " return a json string of the struct by recursively converting struct members into json format" },
1066
1034
{ NULL }
@@ -1103,7 +1071,7 @@ PyTypeObject PyStruct::PyType = {
1103
1071
0 , /* tp_descr_get */
1104
1072
0 , /* tp_descr_set */
1105
1073
0 , /* tp_dictoffset */
1106
- ( initproc ) PyStruct_init_validated , /* tp_init */
1074
+ ( initproc ) PyStruct_init , /* tp_init */
1107
1075
PyType_GenericAlloc, /* tp_alloc */
1108
1076
( newfunc ) PyStruct_new, /* tp_new */
1109
1077
PyObject_GC_Del, /* tp_free */
0 commit comments