Skip to content

Commit 76cf970

Browse files
committed
lsp_plugin: add u64 getter and setter to tlvs
We found a situation where we need to set and get u64s rather than tu64s Signed-off-by: Peter Neuroth <[email protected]>
1 parent 7484d1e commit 76cf970

File tree

1 file changed

+71
-0
lines changed
  • plugins/lsps-plugin/src/lsps2

1 file changed

+71
-0
lines changed

plugins/lsps-plugin/src/lsps2/cln.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)