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