1use crate::sys;
29#[cfg(feature = "serde")]
30use serde::{Deserialize, Serialize};
31
32pub mod button;
33pub mod color;
34pub mod combo;
35pub mod drag;
36pub mod image;
37pub mod input;
38pub mod list_box;
39pub mod menu;
40pub mod misc;
41pub mod multi_select;
42pub mod plot;
43pub mod popup;
44pub mod progress;
45pub mod selectable;
46pub mod slider;
47pub mod tab;
48pub mod table;
49pub mod text;
50pub mod tooltip;
51pub mod tree;
52
53pub use popup::PopupFlags;
55pub use table::{TableBgTarget, TableBuilder, TableColumnSetup};
56
57pub use self::button::*;
59pub use self::color::*;
60pub use self::combo::*;
61pub use self::drag::*;
62pub use self::image::*;
63pub use self::input::*;
64pub use self::list_box::*;
65pub use self::menu::*;
66pub use self::misc::*;
67pub use self::multi_select::*;
68pub use self::plot::*;
69pub use self::popup::*;
70pub use self::progress::*;
71pub use self::selectable::*;
72pub use self::slider::*;
73pub use self::tab::*;
74pub use self::table::*;
75pub use self::tooltip::*;
76pub use self::tree::*;
77
78bitflags::bitflags! {
81 #[repr(transparent)]
83 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
84 pub struct TreeNodeFlags: i32 {
85 const NONE = 0;
87 const SELECTED = sys::ImGuiTreeNodeFlags_Selected as i32;
89 const FRAMED = sys::ImGuiTreeNodeFlags_Framed as i32;
91 const ALLOW_ITEM_OVERLAP = sys::ImGuiTreeNodeFlags_AllowOverlap as i32;
93 const ALLOW_OVERLAP = sys::ImGuiTreeNodeFlags_AllowOverlap as i32;
95 const NO_TREE_PUSH_ON_OPEN = sys::ImGuiTreeNodeFlags_NoTreePushOnOpen as i32;
97 const NO_AUTO_OPEN_ON_LOG = sys::ImGuiTreeNodeFlags_NoAutoOpenOnLog as i32;
99 const DEFAULT_OPEN = sys::ImGuiTreeNodeFlags_DefaultOpen as i32;
101 const OPEN_ON_DOUBLE_CLICK = sys::ImGuiTreeNodeFlags_OpenOnDoubleClick as i32;
103 const OPEN_ON_ARROW = sys::ImGuiTreeNodeFlags_OpenOnArrow as i32;
105 const LEAF = sys::ImGuiTreeNodeFlags_Leaf as i32;
107 const BULLET = sys::ImGuiTreeNodeFlags_Bullet as i32;
109 const FRAME_PADDING = sys::ImGuiTreeNodeFlags_FramePadding as i32;
111 const SPAN_AVAIL_WIDTH = sys::ImGuiTreeNodeFlags_SpanAvailWidth as i32;
113 const SPAN_FULL_WIDTH = sys::ImGuiTreeNodeFlags_SpanFullWidth as i32;
115 const SPAN_LABEL_WIDTH = sys::ImGuiTreeNodeFlags_SpanLabelWidth as i32;
117 const LABEL_SPAN_ALL_COLUMNS = sys::ImGuiTreeNodeFlags_LabelSpanAllColumns as i32;
119 const NAV_LEFT_JUMPS_BACK_HERE = sys::ImGuiTreeNodeFlags_NavLeftJumpsToParent as i32;
121 const COLLAPSING_HEADER =
123 Self::FRAMED.bits() | Self::NO_TREE_PUSH_ON_OPEN.bits() | Self::NO_AUTO_OPEN_ON_LOG.bits();
124 const DRAW_LINES_NONE = sys::ImGuiTreeNodeFlags_DrawLinesNone as i32;
126 const DRAW_LINES_FULL = sys::ImGuiTreeNodeFlags_DrawLinesFull as i32;
128 const DRAW_LINES_TO_NODES = sys::ImGuiTreeNodeFlags_DrawLinesToNodes as i32;
130 }
131}
132
133bitflags::bitflags! {
134 #[repr(transparent)]
139 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
140 pub struct ComboBoxFlags: i32 {
141 const NONE = 0;
143 const POPUP_ALIGN_LEFT = sys::ImGuiComboFlags_PopupAlignLeft as i32;
145 }
146}
147
148#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
150pub enum ComboBoxHeight {
151 Small,
153 Regular,
155 Large,
157 Largest,
159}
160
161impl ComboBoxHeight {
162 #[inline]
163 const fn raw(self) -> i32 {
164 match self {
165 Self::Small => sys::ImGuiComboFlags_HeightSmall as i32,
166 Self::Regular => sys::ImGuiComboFlags_HeightRegular as i32,
167 Self::Large => sys::ImGuiComboFlags_HeightLarge as i32,
168 Self::Largest => sys::ImGuiComboFlags_HeightLargest as i32,
169 }
170 }
171}
172
173#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
175pub enum ComboBoxPreviewMode {
176 #[default]
178 Preview,
179 PreviewNoArrowButton,
181 PreviewFit,
183 PreviewFitNoArrowButton,
185 NoPreview,
187}
188
189impl ComboBoxPreviewMode {
190 #[inline]
191 const fn raw(self) -> i32 {
192 match self {
193 Self::Preview => 0,
194 Self::PreviewNoArrowButton => sys::ImGuiComboFlags_NoArrowButton as i32,
195 Self::PreviewFit => sys::ImGuiComboFlags_WidthFitPreview as i32,
196 Self::PreviewFitNoArrowButton => {
197 sys::ImGuiComboFlags_WidthFitPreview as i32
198 | sys::ImGuiComboFlags_NoArrowButton as i32
199 }
200 Self::NoPreview => sys::ImGuiComboFlags_NoPreview as i32,
201 }
202 }
203}
204
205#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
208pub struct ComboBoxOptions {
209 pub flags: ComboBoxFlags,
210 pub height: Option<ComboBoxHeight>,
211 pub preview_mode: ComboBoxPreviewMode,
212}
213
214impl Default for ComboBoxOptions {
215 fn default() -> Self {
216 Self::new()
217 }
218}
219
220impl ComboBoxOptions {
221 pub const fn new() -> Self {
222 Self {
223 flags: ComboBoxFlags::NONE,
224 height: None,
225 preview_mode: ComboBoxPreviewMode::Preview,
226 }
227 }
228
229 pub fn flags(mut self, flags: ComboBoxFlags) -> Self {
230 self.flags = flags;
231 self
232 }
233
234 pub fn height(mut self, height: ComboBoxHeight) -> Self {
235 self.height = Some(height);
236 self
237 }
238
239 pub fn preview_mode(mut self, mode: ComboBoxPreviewMode) -> Self {
240 self.preview_mode = mode;
241 self
242 }
243
244 pub fn bits(self) -> i32 {
245 self.raw()
246 }
247
248 #[inline]
249 pub(crate) fn raw(self) -> i32 {
250 self.flags.bits() | self.height.map_or(0, ComboBoxHeight::raw) | self.preview_mode.raw()
251 }
252
253 #[inline]
254 pub(crate) fn validate(self, caller: &str) {
255 let unsupported_flags = self.flags.bits() & !ComboBoxFlags::all().bits();
256 assert!(
257 unsupported_flags == 0,
258 "{caller} received non-independent ImGuiComboFlags bits: 0x{unsupported_flags:X}"
259 );
260 let bits = self.raw();
261 let height_mask = sys::ImGuiComboFlags_HeightMask_ as i32;
262 let no_arrow_button = sys::ImGuiComboFlags_NoArrowButton as i32;
263 let no_preview = sys::ImGuiComboFlags_NoPreview as i32;
264 let width_fit_preview = sys::ImGuiComboFlags_WidthFitPreview as i32;
265 let supported = ComboBoxFlags::all().bits() | height_mask | combo_preview_mask();
266 let unsupported = bits & !supported;
267 assert!(
268 unsupported == 0,
269 "{caller} received unsupported ImGuiComboFlags bits: 0x{unsupported:X}"
270 );
271 assert!(
272 bits & (no_arrow_button | no_preview) != (no_arrow_button | no_preview),
273 "{caller} cannot combine NO_ARROW_BUTTON with NO_PREVIEW"
274 );
275 assert!(
276 bits & width_fit_preview == 0 || bits & no_preview == 0,
277 "{caller} cannot combine WIDTH_FIT_PREVIEW with NO_PREVIEW"
278 );
279 assert!(
280 (bits & height_mask).count_ones() <= 1,
281 "{caller} accepts at most one combo height policy"
282 );
283 }
284}
285
286#[inline]
287const fn combo_preview_mask() -> i32 {
288 (sys::ImGuiComboFlags_NoArrowButton
289 | sys::ImGuiComboFlags_NoPreview
290 | sys::ImGuiComboFlags_WidthFitPreview) as i32
291}
292
293impl From<ComboBoxFlags> for ComboBoxOptions {
294 fn from(flags: ComboBoxFlags) -> Self {
295 Self::new().flags(flags)
296 }
297}
298
299bitflags::bitflags! {
300 #[repr(transparent)]
305 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
306 pub struct TableFlags: i32 {
307 const NONE = 0;
309 const RESIZABLE = sys::ImGuiTableFlags_Resizable as i32;
311 const REORDERABLE = sys::ImGuiTableFlags_Reorderable as i32;
313 const HIDEABLE = sys::ImGuiTableFlags_Hideable as i32;
315 const SORTABLE = sys::ImGuiTableFlags_Sortable as i32;
317 const NO_SAVED_SETTINGS = sys::ImGuiTableFlags_NoSavedSettings as i32;
319 const CONTEXT_MENU_IN_BODY = sys::ImGuiTableFlags_ContextMenuInBody as i32;
321 const ROW_BG = sys::ImGuiTableFlags_RowBg as i32;
323 const BORDERS_INNER_H = sys::ImGuiTableFlags_BordersInnerH as i32;
325 const BORDERS_OUTER_H = sys::ImGuiTableFlags_BordersOuterH as i32;
327 const BORDERS_INNER_V = sys::ImGuiTableFlags_BordersInnerV as i32;
329 const BORDERS_OUTER_V = sys::ImGuiTableFlags_BordersOuterV as i32;
331 const BORDERS_H = Self::BORDERS_INNER_H.bits() | Self::BORDERS_OUTER_H.bits();
333 const BORDERS_V = Self::BORDERS_INNER_V.bits() | Self::BORDERS_OUTER_V.bits();
335 const BORDERS_INNER = Self::BORDERS_INNER_V.bits() | Self::BORDERS_INNER_H.bits();
337 const BORDERS_OUTER = Self::BORDERS_OUTER_V.bits() | Self::BORDERS_OUTER_H.bits();
339 const BORDERS = Self::BORDERS_INNER.bits() | Self::BORDERS_OUTER.bits();
341 const NO_BORDERS_IN_BODY = sys::ImGuiTableFlags_NoBordersInBody as i32;
343 const NO_BORDERS_IN_BODY_UNTIL_RESIZE = sys::ImGuiTableFlags_NoBordersInBodyUntilResize as i32;
345 const NO_HOST_EXTEND_X = sys::ImGuiTableFlags_NoHostExtendX as i32;
347 const NO_HOST_EXTEND_Y = sys::ImGuiTableFlags_NoHostExtendY as i32;
349 const NO_KEEP_COLUMNS_VISIBLE = sys::ImGuiTableFlags_NoKeepColumnsVisible as i32;
351 const PRECISE_WIDTHS = sys::ImGuiTableFlags_PreciseWidths as i32;
353 const NO_CLIP = sys::ImGuiTableFlags_NoClip as i32;
355 const PAD_OUTER_X = sys::ImGuiTableFlags_PadOuterX as i32;
357 const NO_PAD_OUTER_X = sys::ImGuiTableFlags_NoPadOuterX as i32;
359 const NO_PAD_INNER_X = sys::ImGuiTableFlags_NoPadInnerX as i32;
361 const SCROLL_X = sys::ImGuiTableFlags_ScrollX as i32;
363 const SCROLL_Y = sys::ImGuiTableFlags_ScrollY as i32;
365 const SORT_MULTI = sys::ImGuiTableFlags_SortMulti as i32;
367 const SORT_TRISTATE = sys::ImGuiTableFlags_SortTristate as i32;
369 const HIGHLIGHT_HOVERED_COLUMN = sys::ImGuiTableFlags_HighlightHoveredColumn as i32;
371 }
372}
373
374#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
376pub enum TableSizingPolicy {
377 FixedFit,
379 FixedSame,
381 StretchProp,
383 StretchSame,
385}
386
387impl TableSizingPolicy {
388 #[inline]
389 const fn raw(self) -> i32 {
390 match self {
391 Self::FixedFit => sys::ImGuiTableFlags_SizingFixedFit as i32,
392 Self::FixedSame => sys::ImGuiTableFlags_SizingFixedSame as i32,
393 Self::StretchProp => sys::ImGuiTableFlags_SizingStretchProp as i32,
394 Self::StretchSame => sys::ImGuiTableFlags_SizingStretchSame as i32,
395 }
396 }
397}
398
399#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
402pub struct TableOptions {
403 pub flags: TableFlags,
404 pub sizing_policy: Option<TableSizingPolicy>,
405}
406
407impl Default for TableOptions {
408 fn default() -> Self {
409 Self::new()
410 }
411}
412
413impl TableOptions {
414 pub const fn new() -> Self {
415 Self {
416 flags: TableFlags::NONE,
417 sizing_policy: None,
418 }
419 }
420
421 pub fn flags(mut self, flags: TableFlags) -> Self {
422 self.flags = flags;
423 self
424 }
425
426 pub fn sizing_policy(mut self, policy: TableSizingPolicy) -> Self {
427 self.sizing_policy = Some(policy);
428 self
429 }
430
431 pub fn bits(self) -> i32 {
432 self.raw()
433 }
434
435 #[inline]
436 pub(crate) fn raw(self) -> i32 {
437 self.flags.bits() | self.sizing_policy.map_or(0, TableSizingPolicy::raw)
438 }
439
440 #[inline]
441 pub(crate) fn validate(self, caller: &str) {
442 let unsupported_flags = self.flags.bits() & !TableFlags::all().bits();
443 assert!(
444 unsupported_flags == 0,
445 "{caller} received non-independent ImGuiTableFlags bits: 0x{unsupported_flags:X}"
446 );
447 let bits = self.raw();
448 let sizing_mask = sys::ImGuiTableFlags_SizingMask_ as i32;
449 let supported = TableFlags::all().bits() | sizing_mask;
450 let unsupported = bits & !supported;
451 assert!(
452 unsupported == 0,
453 "{caller} received unsupported ImGuiTableFlags bits: 0x{unsupported:X}"
454 );
455 let sizing_policy = bits & sizing_mask;
456 assert!(
457 is_valid_table_sizing_policy(sizing_policy),
458 "{caller} received invalid table sizing policy bits: 0x{sizing_policy:X}"
459 );
460 }
461}
462
463#[inline]
464const fn is_valid_table_sizing_policy(bits: i32) -> bool {
465 bits == 0
466 || bits == TableSizingPolicy::FixedFit.raw()
467 || bits == TableSizingPolicy::FixedSame.raw()
468 || bits == TableSizingPolicy::StretchProp.raw()
469 || bits == TableSizingPolicy::StretchSame.raw()
470}
471
472impl From<TableFlags> for TableOptions {
473 fn from(flags: TableFlags) -> Self {
474 Self::new().flags(flags)
475 }
476}
477
478#[cfg(feature = "serde")]
479impl Serialize for TableFlags {
480 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
481 where
482 S: serde::Serializer,
483 {
484 serializer.serialize_i32(self.bits())
485 }
486}
487
488#[cfg(feature = "serde")]
489impl<'de> Deserialize<'de> for TableFlags {
490 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
491 where
492 D: serde::Deserializer<'de>,
493 {
494 let bits = i32::deserialize(deserializer)?;
495 Ok(TableFlags::from_bits_truncate(bits))
496 }
497}
498
499bitflags::bitflags! {
500 #[repr(transparent)]
505 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
506 pub struct TableColumnFlags: i32 {
507 const NONE = 0;
509 const DISABLED = sys::ImGuiTableColumnFlags_Disabled as i32;
511 const DEFAULT_HIDE = sys::ImGuiTableColumnFlags_DefaultHide as i32;
513 const DEFAULT_SORT = sys::ImGuiTableColumnFlags_DefaultSort as i32;
515 const NO_RESIZE = sys::ImGuiTableColumnFlags_NoResize as i32;
517 const NO_REORDER = sys::ImGuiTableColumnFlags_NoReorder as i32;
519 const NO_HIDE = sys::ImGuiTableColumnFlags_NoHide as i32;
521 const NO_CLIP = sys::ImGuiTableColumnFlags_NoClip as i32;
523 const NO_SORT = sys::ImGuiTableColumnFlags_NoSort as i32;
525 const NO_SORT_ASCENDING = sys::ImGuiTableColumnFlags_NoSortAscending as i32;
527 const NO_SORT_DESCENDING = sys::ImGuiTableColumnFlags_NoSortDescending as i32;
529 const NO_HEADER_LABEL = sys::ImGuiTableColumnFlags_NoHeaderLabel as i32;
531 const NO_HEADER_WIDTH = sys::ImGuiTableColumnFlags_NoHeaderWidth as i32;
533 const PREFER_SORT_ASCENDING = sys::ImGuiTableColumnFlags_PreferSortAscending as i32;
535 const PREFER_SORT_DESCENDING = sys::ImGuiTableColumnFlags_PreferSortDescending as i32;
537 const ANGLED_HEADER = sys::ImGuiTableColumnFlags_AngledHeader as i32;
539 }
540}
541
542#[derive(Clone, Copy, Debug, PartialEq)]
544pub enum TableColumnWidth {
545 Fixed(f32),
547 Stretch(f32),
549}
550
551impl TableColumnWidth {
552 pub const fn fixed(width: f32) -> Self {
553 Self::Fixed(width)
554 }
555
556 pub const fn stretch(weight: f32) -> Self {
557 Self::Stretch(weight)
558 }
559
560 #[inline]
561 pub(crate) const fn raw_flags(self) -> i32 {
562 match self {
563 Self::Fixed(_) => sys::ImGuiTableColumnFlags_WidthFixed as i32,
564 Self::Stretch(_) => sys::ImGuiTableColumnFlags_WidthStretch as i32,
565 }
566 }
567
568 #[inline]
569 pub(crate) const fn value(self) -> f32 {
570 match self {
571 Self::Fixed(value) | Self::Stretch(value) => value,
572 }
573 }
574}
575
576#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
578pub enum TableColumnIndent {
579 Enable,
581 Disable,
583}
584
585impl TableColumnIndent {
586 #[inline]
587 pub const fn bits(self) -> i32 {
588 self.raw_flags()
589 }
590
591 #[inline]
592 pub(crate) const fn raw_flags(self) -> i32 {
593 match self {
594 Self::Enable => sys::ImGuiTableColumnFlags_IndentEnable as i32,
595 Self::Disable => sys::ImGuiTableColumnFlags_IndentDisable as i32,
596 }
597 }
598}
599
600bitflags::bitflags! {
601 #[repr(transparent)]
603 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
604 pub struct TableColumnStateFlags: i32 {
605 const NONE = 0;
607 const DISABLED = sys::ImGuiTableColumnFlags_Disabled as i32;
609 const DEFAULT_HIDE = sys::ImGuiTableColumnFlags_DefaultHide as i32;
611 const DEFAULT_SORT = sys::ImGuiTableColumnFlags_DefaultSort as i32;
613 const WIDTH_FIXED = sys::ImGuiTableColumnFlags_WidthFixed as i32;
615 const WIDTH_STRETCH = sys::ImGuiTableColumnFlags_WidthStretch as i32;
617 const NO_RESIZE = sys::ImGuiTableColumnFlags_NoResize as i32;
619 const NO_REORDER = sys::ImGuiTableColumnFlags_NoReorder as i32;
621 const NO_HIDE = sys::ImGuiTableColumnFlags_NoHide as i32;
623 const NO_CLIP = sys::ImGuiTableColumnFlags_NoClip as i32;
625 const NO_SORT = sys::ImGuiTableColumnFlags_NoSort as i32;
627 const NO_SORT_ASCENDING = sys::ImGuiTableColumnFlags_NoSortAscending as i32;
629 const NO_SORT_DESCENDING = sys::ImGuiTableColumnFlags_NoSortDescending as i32;
631 const NO_HEADER_LABEL = sys::ImGuiTableColumnFlags_NoHeaderLabel as i32;
633 const NO_HEADER_WIDTH = sys::ImGuiTableColumnFlags_NoHeaderWidth as i32;
635 const PREFER_SORT_ASCENDING = sys::ImGuiTableColumnFlags_PreferSortAscending as i32;
637 const PREFER_SORT_DESCENDING = sys::ImGuiTableColumnFlags_PreferSortDescending as i32;
639 const INDENT_ENABLE = sys::ImGuiTableColumnFlags_IndentEnable as i32;
641 const INDENT_DISABLE = sys::ImGuiTableColumnFlags_IndentDisable as i32;
643 const ANGLED_HEADER = sys::ImGuiTableColumnFlags_AngledHeader as i32;
645 const IS_ENABLED = sys::ImGuiTableColumnFlags_IsEnabled as i32;
647 const IS_VISIBLE = sys::ImGuiTableColumnFlags_IsVisible as i32;
649 const IS_SORTED = sys::ImGuiTableColumnFlags_IsSorted as i32;
651 const IS_HOVERED = sys::ImGuiTableColumnFlags_IsHovered as i32;
653 }
654}
655
656impl From<TableColumnFlags> for TableColumnStateFlags {
657 fn from(flags: TableColumnFlags) -> Self {
658 Self::from_bits_retain(flags.bits())
659 }
660}
661
662impl TableColumnFlags {
663 #[inline]
664 pub(crate) fn validate_for_setup(
665 self,
666 caller: &str,
667 width: Option<TableColumnWidth>,
668 indent: Option<TableColumnIndent>,
669 ) {
670 let unsupported_flags = self.bits() & !TableColumnFlags::all().bits();
671 assert!(
672 unsupported_flags == 0,
673 "{caller} received non-independent ImGuiTableColumnFlags bits: 0x{unsupported_flags:X}"
674 );
675 let bits = self.bits()
676 | width.map_or(0, TableColumnWidth::raw_flags)
677 | indent.map_or(0, TableColumnIndent::raw_flags);
678 let width_mask = sys::ImGuiTableColumnFlags_WidthMask_ as i32;
679 let indent_mask = sys::ImGuiTableColumnFlags_IndentMask_ as i32;
680 let supported = TableColumnFlags::all().bits() | width_mask | indent_mask;
681 let unsupported = bits & !supported;
682 assert!(
683 unsupported == 0,
684 "{caller} received unsupported ImGuiTableColumnFlags bits: 0x{unsupported:X}"
685 );
686 assert!(
687 (bits & width_mask).count_ones() <= 1,
688 "{caller} accepts at most one table column width policy"
689 );
690 assert!(
691 (bits & indent_mask).count_ones() <= 1,
692 "{caller} accepts at most one table column indent policy"
693 );
694 }
695}
696
697#[cfg(feature = "serde")]
698impl Serialize for TableColumnFlags {
699 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
700 where
701 S: serde::Serializer,
702 {
703 serializer.serialize_i32(self.bits())
704 }
705}
706
707#[cfg(feature = "serde")]
708impl<'de> Deserialize<'de> for TableColumnFlags {
709 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
710 where
711 D: serde::Deserializer<'de>,
712 {
713 let bits = i32::deserialize(deserializer)?;
714 Ok(TableColumnFlags::from_bits_truncate(bits))
715 }
716}
717
718#[cfg(feature = "serde")]
719impl Serialize for TableColumnStateFlags {
720 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
721 where
722 S: serde::Serializer,
723 {
724 serializer.serialize_i32(self.bits())
725 }
726}
727
728#[cfg(feature = "serde")]
729impl<'de> Deserialize<'de> for TableColumnStateFlags {
730 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
731 where
732 D: serde::Deserializer<'de>,
733 {
734 let bits = i32::deserialize(deserializer)?;
735 Ok(TableColumnStateFlags::from_bits_truncate(bits))
736 }
737}