@@ -324,6 +324,32 @@ pub mod tlv {
324324 Ok ( None )
325325 }
326326 }
327+
328+ /// Insert or override a `u64` value for `type_` (keeps cannonical TLV
329+ /// order).
330+ pub fn set_u64 ( & mut self , type_ : u64 , value : u64 ) {
331+ let enc = value. to_be_bytes ( ) . to_vec ( ) ;
332+ if let Some ( rec) = self . 0 . iter_mut ( ) . find ( |r| r. type_ == type_) {
333+ rec. value = enc;
334+ } else {
335+ self . 0 . push ( TlvRecord { type_, value : enc } ) ;
336+ self . 0 . sort_by_key ( |r| r. type_ ) ;
337+ }
338+ }
339+
340+ /// Read a `u64` if present.Returns Ok(None) if the type isn't present.
341+ pub fn get_u64 ( & self , type_ : u64 ) -> Result < Option < u64 > , TlvError > {
342+ if let Some ( rec) = self . 0 . iter ( ) . find ( |r| r. type_ == type_) {
343+ let value = u64:: from_be_bytes (
344+ rec. value [ ..]
345+ . try_into ( )
346+ . map_err ( |e| TlvError :: Other ( format ! ( "failed not decode to u64: {e}" ) ) ) ?,
347+ ) ;
348+ Ok ( Some ( value) )
349+ } else {
350+ Ok ( None )
351+ }
352+ }
327353 }
328354
329355 impl Serialize for TlvStream {
@@ -622,6 +648,44 @@ pub mod tlv {
622648 ) ;
623649 }
624650
651+ #[ test]
652+ fn set_and_get_u64_basic ( ) -> Result < ( ) > {
653+ let mut s = TlvStream :: default ( ) ;
654+ s. set_u64 ( 42 , 123456789 ) ;
655+ assert_eq ! ( s. get_u64( 42 ) ?, Some ( 123456789 ) ) ;
656+ Ok ( ( ) )
657+ }
658+
659+ #[ test]
660+ fn set_u64_overwrite_keeps_order ( ) -> Result < ( ) > {
661+ let mut s = TlvStream ( vec ! [
662+ TlvRecord {
663+ type_: 1 ,
664+ value: vec![ 0xaa ] ,
665+ } ,
666+ TlvRecord {
667+ type_: 10 ,
668+ value: vec![ 0xbb ] ,
669+ } ,
670+ ] ) ;
671+
672+ // insert between 1 and 10
673+ s. set_u64 ( 5 , 7 ) ;
674+ assert_eq ! (
675+ s. 0 . iter( ) . map( |r| r. type_) . collect:: <Vec <_>>( ) ,
676+ vec![ 1 , 5 , 10 ]
677+ ) ;
678+ assert_eq ! ( s. get_u64( 5 ) ?, Some ( 7 ) ) ;
679+
680+ // overwrite existing 5 (no duplicate, order preserved)
681+ s. set_u64 ( 5 , 9 ) ;
682+ let types: Vec < u64 > = s. 0 . iter ( ) . map ( |r| r. type_ ) . collect ( ) ;
683+ assert_eq ! ( types, vec![ 1 , 5 , 10 ] ) ;
684+ assert_eq ! ( s. 0 . iter( ) . filter( |r| r. type_ == 5 ) . count( ) , 1 ) ;
685+ assert_eq ! ( s. get_u64( 5 ) ?, Some ( 9 ) ) ;
686+ Ok ( ( ) )
687+ }
688+
625689 #[ test]
626690 fn set_and_get_tu64_basic ( ) -> Result < ( ) > {
627691 let mut s = TlvStream :: default ( ) ;
@@ -630,6 +694,13 @@ pub mod tlv {
630694 Ok ( ( ) )
631695 }
632696
697+ #[ test]
698+ fn get_u64_missing_returns_none ( ) -> Result < ( ) > {
699+ let s = TlvStream :: default ( ) ;
700+ assert_eq ! ( s. get_u64( 999 ) ?, None ) ;
701+ Ok ( ( ) )
702+ }
703+
633704 #[ test]
634705 fn set_tu64_overwrite_keeps_order ( ) -> Result < ( ) > {
635706 let mut s = TlvStream ( vec ! [
0 commit comments