@@ -20,8 +20,7 @@ class PyObjectStructField final : public DialectGenericStructField
2020public:
2121 using BASE = DialectGenericStructField;
2222 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 ) ),
2524 m_pytype ( pytype )
2625 {}
2726
@@ -120,9 +119,8 @@ static PyObject * PyStructMeta_new( PyTypeObject *subtype, PyObject *args, PyObj
120119 if ( !keystr )
121120 CSP_THROW ( PythonPassthrough, " " );
122121
123- if (!PySet_Check (optional_fields)) {
122+ if (!PySet_Check (optional_fields))
124123 CSP_THROW ( TypeError, " Struct metadata for key " << keystr << " expected a set, got " << PyObjectPtr::incref ( optional_fields ) );
125- }
126124
127125 bool isOptional = PySet_Contains ( optional_fields, key ) == 1 ;
128126
@@ -134,33 +132,36 @@ static PyObject * PyStructMeta_new( PyTypeObject *subtype, PyObject *args, PyObj
134132
135133 switch ( csptype -> type () )
136134 {
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 ;
147145 case csp::CspType::Type::ARRAY :
148146 {
149147 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>
151149 {
152150 using CElemType = typename decltype (tag)::type;
153151 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 );
155153 } );
156154
157155 break ;
158156 }
159157
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 ;
161159 default :
162160 CSP_THROW ( ValueError, " Unexpected csp type " << csptype -> type () << " on struct " << name );
163161 }
162+
163+ if ( !isOptional )
164+ field -> setRequired ( );
164165
165166 fields.emplace_back ( field );
166167 }
@@ -364,29 +365,10 @@ static PyObject * PyStructMeta_metadata_info( PyStructMeta * m )
364365
365366int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs, bool validate );
366367
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- }
385368
386369static PyMethodDef PyStructMeta_methods[] = {
387370 {" _layout" , (PyCFunction) PyStructMeta_layout, METH_NOARGS , " debug view of structs internal mem layout" },
388371 {" _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" },
390372 {NULL }
391373};
392374
@@ -836,27 +818,16 @@ PyObject * PyStruct_validate( PyStruct * self ) {
836818 CSP_RETURN_NONE ;
837819}
838820
839- int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs, bool validate )
821+ int PyStruct_init ( PyStruct * self, PyObject * args, PyObject * kwargs )
840822{
841823 CSP_BEGIN_METHOD ;
842824
843825 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- }
826+ self -> struct_ -> validate ();
851827
852828 CSP_RETURN_INT ;
853829}
854830
855- static int PyStruct_init_validated ( PyStruct * self, PyObject * args, PyObject * kwargs )
856- {
857- return PyStruct_init ( self, args, kwargs, true );
858- }
859-
860831PyObject * PyStruct_update ( PyStruct * self, PyObject * args, PyObject * kwargs )
861832{
862833 CSP_BEGIN_METHOD ;
@@ -1060,7 +1031,6 @@ static PyMethodDef PyStruct_methods[] = {
10601031 { " 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" },
10611032 { " 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" },
10621033 { " 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...)" },
10641034 { " 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" },
10651035 { " 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" },
10661036 { NULL }
@@ -1103,7 +1073,7 @@ PyTypeObject PyStruct::PyType = {
11031073 0 , /* tp_descr_get */
11041074 0 , /* tp_descr_set */
11051075 0 , /* tp_dictoffset */
1106- ( initproc ) PyStruct_init_validated , /* tp_init */
1076+ ( initproc ) PyStruct_init , /* tp_init */
11071077 PyType_GenericAlloc, /* tp_alloc */
11081078 ( newfunc ) PyStruct_new, /* tp_new */
11091079 PyObject_GC_Del, /* tp_free */
0 commit comments