bitcoin_internals/
script.rs1pub fn read_push_data_len(
15 data: &mut core::slice::Iter<'_, u8>,
16 size: PushDataLenLen,
17) -> Result<usize, EarlyEndOfScriptError> {
18 let size = size as usize;
21
22 if data.len() < size {
23 return Err(EarlyEndOfScriptError);
24 };
25
26 let mut ret = 0;
27 for (i, item) in data.take(size).enumerate() {
28 ret |= usize::from(*item) << (i * 8);
29 }
30 Ok(ret)
31}
32
33#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
37pub enum PushDataLenLen {
38 One = 1,
40 Two = 2,
42 Four = 4,
44}
45
46#[derive(Debug)]
48pub struct EarlyEndOfScriptError;
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn reads_4_bytes() {
56 let bytes = [0x01, 0x23, 0x45, 0x67];
57 let want = u32::from_le_bytes([0x01, 0x23, 0x45, 0x67]);
58 let got = read_push_data_len(&mut bytes.iter(), PushDataLenLen::Four).unwrap();
59 assert_eq!(got, want as usize);
60 }
61
62 #[test]
63 fn reads_2_bytes() {
64 let bytes = [0x01, 0x23];
65 let want = u16::from_le_bytes([0x01, 0x23]);
66 let got = read_push_data_len(&mut bytes.iter(), PushDataLenLen::Two).unwrap();
67 assert_eq!(got, want as usize);
68 }
69
70 #[test]
71 fn reads_1_byte() {
72 let bytes = [0x01];
73 let want = 0x01;
74 let got = read_push_data_len(&mut bytes.iter(), PushDataLenLen::One).unwrap();
75 assert_eq!(got, want as usize);
76 }
77}