+class _StructureField(
+ _StructureFieldConst, _ContainerField, collections.abc.MutableMapping
+):
+ _NAME = 'Structure'
+ _borrow_member_field_ptr_by_index = staticmethod(
+ native_bt.field_structure_borrow_member_field_by_index
+ )
+ _borrow_member_field_ptr_by_name = staticmethod(
+ native_bt.field_structure_borrow_member_field_by_name
+ )
+
+ def __setitem__(self, key, value):
+ # raises if key is somehow invalid
+ field = self[key]
+
+ # the field's property does the appropriate conversion or raises
+ # the appropriate exception
+ field.value = value
+
+ def _set_value(self, values):
+ try:
+ for key, value in values.items():
+ self[key].value = value
+ except Exception:
+ raise
+
+ value = property(fset=_set_value)
+
+
+class _OptionFieldConst(_FieldConst):
+ _NAME = 'Const option'
+ _borrow_field_ptr = staticmethod(native_bt.field_option_borrow_field_const)
+
+ @property
+ def field(self):
+ field_ptr = self._borrow_field_ptr(self._ptr)
+
+ if field_ptr is None:
+ return
+
+ return self._create_field_from_ptr(
+ field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
+ )
+
+ @property
+ def has_field(self):
+ return self.field is not None
+
+ def _spec_eq(self, other):
+ return _get_leaf_field(self) == other
+
+ def __bool__(self):
+ return self.has_field
+
+ def __str__(self):
+ return str(self.field)
+
+ def _repr(self):
+ return repr(self.field)
+
+
+class _OptionField(_OptionFieldConst, _Field):
+ _NAME = 'Option'
+ _borrow_field_ptr = staticmethod(native_bt.field_option_borrow_field)
+
+ def _has_field(self, value):
+ utils._check_bool(value)
+ native_bt.field_option_set_has_field(self._ptr, value)
+
+ has_field = property(fget=_OptionFieldConst.has_field.fget, fset=_has_field)
+
+ def _set_value(self, value):
+ self.has_field = True
+ field = self.field
+ assert field is not None
+ field.value = value
+
+ value = property(fset=_set_value)
+
+
+class _VariantFieldConst(_ContainerFieldConst, _FieldConst):
+ _NAME = 'Const variant'
+ _borrow_selected_option_field_ptr = staticmethod(
+ native_bt.field_variant_borrow_selected_option_field_const
+ )
+
+ def _count(self):
+ return len(self.cls)