@@ -17,6 +17,8 @@ use core::marker::PhantomData;
17
17
use core:: mem:: size_of;
18
18
use num_traits:: FromPrimitive ;
19
19
use pre:: pre;
20
+ #[ cfg( feature = "serde" ) ]
21
+ use serde_context:: SerializeWithContext ;
20
22
use zerocopy:: { AsBytes , FromBytes } ;
21
23
22
24
#[ cfg( feature = "serde" ) ]
@@ -117,6 +119,7 @@ impl<'a> EntryItemBody<&'a [u8]> {
117
119
118
120
#[ derive( Debug ) ]
119
121
pub struct EntryMutItem < ' a > {
122
+ pub ( crate ) context : u64 ,
120
123
pub ( crate ) header : & ' a mut ENTRY_HEADER ,
121
124
pub body : EntryItemBody < & ' a mut [ u8 ] > ,
122
125
}
@@ -420,6 +423,7 @@ use std::fmt;
420
423
421
424
#[ derive( Clone ) ]
422
425
pub struct EntryItem < ' a > {
426
+ pub ( crate ) context : u64 ,
423
427
pub ( crate ) header : & ' a ENTRY_HEADER ,
424
428
pub body : EntryItemBody < & ' a [ u8 ] > ,
425
429
}
@@ -613,6 +617,151 @@ impl schemars::JsonSchema for SerdeEntryItem {
613
617
}
614
618
}
615
619
620
+ #[ cfg( feature = "serde" ) ]
621
+ impl < ' a > SerializeWithContext for EntryItem < ' a > {
622
+ type Context = u64 ;
623
+ fn serialize_with_context < S > (
624
+ & self ,
625
+ serializer : S ,
626
+ context : Self :: Context ,
627
+ ) -> core:: result:: Result < S :: Ok , S :: Error >
628
+ where
629
+ S : Serializer ,
630
+ {
631
+ use crate :: df:: SlinkConfig ;
632
+ use crate :: fch;
633
+ use crate :: gnb;
634
+ use crate :: memory;
635
+ use crate :: psp;
636
+ assert ! ( self . context == 42 ) ;
637
+ let mut state = serializer. serialize_struct ( "EntryItem" , 2 ) ?;
638
+ state. serialize_field ( "header" , self . header ) ?;
639
+
640
+ // TODO: Automate this type determination instead of maintaining this
641
+ // manually.
642
+ match & self . body {
643
+ EntryItemBody :: < _ > :: Tokens ( tokens) => {
644
+ let v = tokens
645
+ . iter ( )
646
+ . map_err ( |e| serde:: ser:: Error :: custom ( format ! ( "{e:?}" ) ) ) ?
647
+ . collect :: < Vec < _ > > ( ) ;
648
+ state. serialize_field ( "tokens" , & v) ?;
649
+ }
650
+ EntryItemBody :: < _ > :: Struct ( buf) => {
651
+ if let Some ( s) = self . body_as_struct_array :: < memory:: LrdimmDdr4OdtPatElement > ( ) {
652
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
653
+ state. serialize_field ( "LrdimmDdr4OdtPatElement" , & v) ?;
654
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: Ddr4OdtPatElement > ( ) {
655
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
656
+ state. serialize_field ( "Ddr4OdtPatElement" , & v) ?;
657
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: DdrPostPackageRepairElement > ( ) {
658
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
659
+ state. serialize_field ( "DdrPostPackageRepairElement" , & v) ?;
660
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: DimmInfoSmbusElement > ( ) {
661
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
662
+ state. serialize_field ( "DimmInfoSmbusElement" , & v) ?;
663
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: RdimmDdr4CadBusElement > ( ) {
664
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
665
+ state. serialize_field ( "RdimmDdr4CadBusElement" , & v) ?;
666
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: UdimmDdr4CadBusElement > ( ) {
667
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
668
+ state. serialize_field ( "UdimmDdr4CadBusElement" , & v) ?;
669
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: LrdimmDdr4CadBusElement > ( ) {
670
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
671
+ state. serialize_field ( "LrdimmDdr4CadBusElement" , & v) ?;
672
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: Ddr4DataBusElement > ( ) {
673
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
674
+ state. serialize_field ( "Ddr4DataBusElement" , & v) ?;
675
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: LrdimmDdr4DataBusElement > ( ) {
676
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
677
+ state. serialize_field ( "LrdimmDdr4DataBusElement" , & v) ?;
678
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: MaxFreqElement > ( ) {
679
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
680
+ state. serialize_field ( "MaxFreqElement" , & v) ?;
681
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: LrMaxFreqElement > ( ) {
682
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
683
+ state. serialize_field ( "LrMaxFreqElement" , & v) ?;
684
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: Ddr5CaPinMapElement > ( ) {
685
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
686
+ state. serialize_field ( "Ddr5CaPinMapElement" , & v) ?;
687
+ // } else if let Some(s) = self.body_as_struct_array::<memory::MemDfeSearchElement32>() { // UH OH
688
+ // let v = s.iter().collect::<Vec<_>>();
689
+ // state.serialize_field("MemDfeSearchElement32", &v)?;
690
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: MemDfeSearchElement36 > ( ) {
691
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
692
+ state. serialize_field ( "MemDfeSearchElement36" , & v) ?;
693
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: DdrDqPinMapElement > ( ) {
694
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
695
+ state. serialize_field ( "DdrDqPinMapElement" , & v) ?;
696
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: RdimmDdr5BusElement > ( ) {
697
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
698
+ state. serialize_field ( "RdimmDdr5BusElement" , & v) ?;
699
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < memory:: ConsoleOutControl > ( ) {
700
+ state. serialize_field ( "ConsoleOutControl" , & s) ?;
701
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < memory:: NaplesConsoleOutControl > ( ) {
702
+ state. serialize_field ( "NaplesConsoleOutControl" , & s) ?;
703
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < memory:: ExtVoltageControl > ( ) {
704
+ state. serialize_field ( "ExtVoltageControl" , & s) ?;
705
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < memory:: ErrorOutControl116 > ( ) {
706
+ state. serialize_field ( "ErrorOutControl116" , & s) ?;
707
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < memory:: ErrorOutControl112 > ( ) {
708
+ state. serialize_field ( "ErrorOutControl112" , & s) ?;
709
+ } else if let Some ( ( s, _) ) = self . body_as_struct :: < SlinkConfig > ( ) {
710
+ state. serialize_field ( "SlinkConfig" , & s) ?;
711
+ } else if let Some ( ( header, s) ) = self . body_as_struct :: < psp:: BoardIdGettingMethodGpio > ( ) {
712
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
713
+ let t = ( header, v) ;
714
+ state. serialize_field ( "BoardIdGettingMethodGpio" , & t) ?;
715
+ } else if let Some ( ( header, s) ) = self . body_as_struct :: < psp:: BoardIdGettingMethodEeprom > ( ) {
716
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
717
+ let t = ( header, v) ;
718
+ state. serialize_field ( "BoardIdGettingMethodEeprom" , & t) ?;
719
+ } else if let Some ( ( header, s) ) = self . body_as_struct :: < psp:: BoardIdGettingMethodSmbus > ( ) {
720
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
721
+ let t = ( header, v) ;
722
+ state. serialize_field ( "BoardIdGettingMethodSmbus" , & t) ?;
723
+ } else if let Some ( ( header, s) ) = self . body_as_struct :: < psp:: BoardIdGettingMethodCustom > ( ) {
724
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
725
+ let t = ( header, v) ;
726
+ state. serialize_field ( "BoardIdGettingMethodCustom" , & t) ?;
727
+ } else if let Some ( ( header, _) ) = self . body_as_struct :: < fch:: EspiInit > ( ) {
728
+ state. serialize_field ( "EspiInit" , & header) ?;
729
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: PmuBistVendorAlgorithmElement > ( ) {
730
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
731
+ state. serialize_field ( "PmuBistVendorAlgorithmElement" , & v) ?;
732
+ } else if let Some ( s) = self . body_as_struct_array :: < memory:: Ddr5RawCardConfigElement > ( ) {
733
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
734
+ state. serialize_field ( "Ddr5RawCardConfigElement" , & v) ?;
735
+ } else if let Some ( s) = self . body_as_struct_array :: < fch:: EspiSioInitElement > ( ) { // TODO terminator, so variant
736
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
737
+ state. serialize_field ( "EspiSioInitElement" , & v) ?;
738
+ } else if let Some ( s) = self . body_as_struct_array :: < gnb:: EarlyPcieConfigElement > ( ) {
739
+ let v = s. iter ( ) . collect :: < Vec < _ > > ( ) ;
740
+ state. serialize_field ( "EarlyPcieConfigElement" , & v) ?;
741
+ } else if let Some ( s) =
742
+ self . body_as_struct_sequence :: < memory:: platform_specific_override:: ElementRef < ' _ > > ( ) {
743
+ let i = s. iter ( ) . unwrap ( ) ;
744
+ let v = i. collect :: < Vec < _ > > ( ) ;
745
+ state. serialize_field ( "platform_specific_overrides" , & v) ?;
746
+ } else if let Some ( s) =
747
+ self . body_as_struct_sequence :: < memory:: platform_tuning:: ElementRef < ' _ > > ( ) {
748
+ let i = s. iter ( ) . unwrap ( ) ;
749
+ let v = i. collect :: < Vec < _ > > ( ) ;
750
+ state. serialize_field ( "platform_tuning" , & v) ?;
751
+ } else if let Some ( ( _, s) ) = self . body_as_struct :: < Parameters > ( ) {
752
+ let parameters = ParametersIter :: new ( s. into_slice ( ) )
753
+ . map_err ( |_| serde:: ser:: Error :: custom ( "could not serialize Parameters" ) ) ?;
754
+ let v = parameters. collect :: < Vec < _ > > ( ) ;
755
+ state. serialize_field ( "parameters" , & v) ?;
756
+ } else {
757
+ state. serialize_field ( "struct_body" , & buf) ?;
758
+ }
759
+ }
760
+ }
761
+ state. end ( )
762
+ }
763
+ }
764
+
616
765
#[ cfg( feature = "serde" ) ]
617
766
impl < ' a > Serialize for EntryItem < ' a > {
618
767
fn serialize < S > (
0 commit comments