ton_lib 0.0.38

A collection of types and utilities for interacting with the TON network
use crate::tlb_adapters::{DictKeyAdapterTonHash, DictValAdapterTLB, TLBHashMap};
use std::collections::HashMap;
use std::ops::{Deref, DerefMut};
use ton_lib_core::cell::{TonCellRef, TonHash};
use ton_lib_core::error::TLCoreError;
use ton_lib_core::TLBDerive;

/// Contains dict (TLBHashMap), no 'present' marker in root cell
#[derive(Debug, Clone, PartialEq, Default, TLBDerive)]
pub struct LibsDict {
    #[tlb_derive(adapter = "TLBHashMap::<DictKeyAdapterTonHash, DictValAdapterTLB, _, _>::new(256)")]
    data: HashMap<TonHash, TonCellRef>,
}

impl LibsDict {
    pub fn new<I: IntoIterator<Item = TonCellRef>>(libs: I) -> Result<Self, TLCoreError> {
        let mut data = HashMap::new();
        for lib in libs {
            data.insert(lib.hash()?.clone(), lib);
        }
        Ok(LibsDict { data })
    }
}

impl From<HashMap<TonHash, TonCellRef>> for LibsDict {
    fn from(data: HashMap<TonHash, TonCellRef>) -> Self { LibsDict { data } }
}

impl Deref for LibsDict {
    type Target = HashMap<TonHash, TonCellRef>;
    fn deref(&self) -> &Self::Target { &self.data }
}

impl DerefMut for LibsDict {
    fn deref_mut(&mut self) -> &mut Self::Target { &mut self.data }
}

#[cfg(test)]
mod tests {
    use super::*;

    use std::str::FromStr;
    use ton_lib_core::traits::tlb::TLB;

    #[test]
    fn test_libs_dict() -> anyhow::Result<()> {
        let lib_id = TonHash::from_str("D29017573B8132BE742E9C02DABE2311FB3DF9F077E661D3EE24D431058B8830")?;
        let lib_cell = TonCellRef::from_boc_hex("b5ee9c7201022501000a0e000114ff00f4a413f4bcf2c80b0102016202030202c90405020120060701cbd8831c02497c138087434c0dc009c6c260c5fc0a00835c85677be903e900c7e800c5c75c87e800c7e800c1cea6d0000f4c7f4cfc412040dc415914110c4dbc27e187e105bc4373e105bc45c007e910c006ebcb8157b513434c7c07e18b5007e18f5007e1934608020148090a001bbe0c83938c5bb932b632b0b9b2c40202710b0c024ef8416f17f8416f1382104f5f4313ba8e8ff8416f1382102c76b973bae3023070e30ddc840ff2f00d0e0145a610411806f05b59d3b200005cc708c11806f05b59d3b20000290154c2782651f187400f0137a410411806f05b59d3b200005d4d98411812dca375e059b0b9f187401000f5adbcf6a268698f80fc316a00fc31ea00fc3268903800fd221800dd79702afc1400e4387d0100e78b00e78b64fc2180b6b6b7823810b7921037471a2d81b79210b7470918b810646580a9207a0029187a0065806480ef2198291837820098907c803a6465810a650389e5ffe4e82009c91a1a712a8111b7820098c00037af16f6a268698f80fc316a00fc31ea00fc3268b83fc5817c227c21c001fefa40d200d195c821cf16c9916de2f82822c870fa0201cf1601cf16c9f843016d6d6f04027001fa443001ba8e480170216f24206e8e345b036f24216e8e12317020c8cb015240f4005230f400cb00c901de433052306f04013120f90074c8cb0214ca0713cbffc9d04013923434e25502236f04013193318b02e282089896801101daf8416f16f8416f12a7038208989680a08208989680a08208989680a08208989680a0bcf2e053fa40fa40d1217001fa443001ba217001fa443001bab0f2e055f82858c870fa0201cf1601cf16c9f843016d6d6f048208989680f8416f15f82ca0f8416f16a101b60970fb0270661201fe702182b05803bcc5cb9634ba4cfb2213f784019318ed4dcb6017880faa35be8e23308288195e54c5dd42177f53a27172fa9ec630262827aa23a904821b782dace9d9aa18de2182708bcc0026baae9e45e470190267a230cfaa18be8e1c0182501425982cf597cd205cef7380a90401821b782dace9d9aa17a0dea76401a7641302fc8200c354218235c702bd3a30fc0000be228238070c1cc73b00c80000bbb0f2f420c1008e1282300de0b6b3a76400005202a3f05812a984e020821b782dace9d9aa18be8e2820821b782dace9d9aa17be8e18821b782dace9d9aa17a182501425982cf597cd205cef73809171e2e30d01a7648238056bc75e2d631000002114150096f8416f15f82ca0f8416f16a101b60970fb0270f8416f1150238210d1735400f8416f1401c8cb1fcb3f58cf16f40012810090708018c8cb055004cf165004fa0212cb6a01cf17c901fb007f01fe216f24206e8e345b036f24216e8e12317020c8cb015240f4005230f400cb00c901de433052306f04013120f90074c8cb0214ca0713cbffc9d04013923434e25502236f0401016f24216e8e12317020c8cb015240f4005230f400cb00c901de433052306f0401310382106540cf85f8416f1401c8cb1fcb3f01cf16413083061601f2208261855144814a7ff805980ff0084000be8e2a8238056bc75e2d631000008261855144814a7ff805980ff0084000a98401822056bc75e2d631aa18a001de20824adf0ab5a80a22c61ab5a700be8e278238056bc75e2d63100000824adf0ab5a80a22c61ab5a700a98401822056bc75e2d631aa17a001de20170042821b782dace9d9aa18a18288195e54c5dd42177f53a27172fa9ec630262827aa2303fc822056bc75e2d631aa18be8e1c30822056bc75e2d631aa18a18261855144814a7ff805980ff0084000de21822056bc75e2d631aa17be8e2701822056bc75e2d631aa17a101824adf0ab5a80a22c61ab5a7008238056bc75e2d63100000a984de21822056bc75e2d631aa16bee30021823815af1d78b58c400000bee3002118191a0034768018c8cb055005cf165005fa0213cb6bcc01cf17c901fb007f02f882403f1fce3da636ea5cf850be8e268238056bc75e2d6310000082403f1fce3da636ea5cf850a98401822056bc75e2d631aa16a001de20823927fa27722cc06cc5e2be8e268238056bc75e2d63100000823927fa27722cc06cc5e2a98401823815af1d78b58c400000a001de208238280e60114edb805d03bee300201b1c004c01822056bc75e2d631aa16a10182403f1fce3da636ea5cf8508238056bc75e2d63100000a984004c01823815af1d78b58c400000a101823927fa27722cc06cc5e28238056bc75e2d63100000a98402f482380ad78ebc5ac6200000be8e260182380ad78ebc5ac6200000a1018238280e60114edb805d038238056bc75e2d63100000a984de218238056bc75e2d63100000be8e26018238056bc75e2d63100000a10182380ebc5fb417461211108238056bc75e2d63100000a984de218232b5e3af16b1880000bee300211d1e004c8238056bc75e2d631000008238280e60114edb805d03a9840182380ad78ebc5ac6200000a00102f482380ebc5fb41746121110be8e268238056bc75e2d6310000082380ebc5fb41746121110a984018238056bc75e2d63100000a001de20823808f00f760a4b2db55dbe8e258238056bc75e2d63100000823808f00f760a4b2db55da984018232b5e3af16b1880000a001de20823806f5f1775788937937bee300201f20004a018232b5e3af16b1880000a101823808f00f760a4b2db55d8238056bc75e2d63100000a98401ec82315af1d78b58c40000be8e250182315af1d78b58c40000a101823806f5f17757889379378238056bc75e2d63100000a984de218238056bc75e2d6310000021a0511382380ad78ebc5ac6200000a98466a0511382381043561a8829300000a98466a05113823815af1d78b58c400000a98466a0511321004a8238056bc75e2d63100000823806f5f1775788937937a9840182315af1d78b58c40000a00101ec823806248f33704b286603be8e258238056bc75e2d63100000823806248f33704b286603a984018230ad78ebc5ac620000a001de20823805c548670b9510e7acbe8e258238056bc75e2d63100000823805c548670b9510e7aca98401823056bc75e2d6310000a001de208238056bc75e2d63100000a12201ea82381b1ae4d6e2ef500000a98466a0511382382086ac351052600000a98466a05113823825f273933db5700000a98466a05113822056bc75e2d631aa16a98466a05113823830ca024f987b900000a98466a0511382383635c9adc5dea00000a98466a0511382383ba1910bf341b00000a98466a0032301fe8238056bc75e2d631000005122a012a98453008238056bc75e2d63100000a9845c8238056bc75e2d63100000a9842073a90413a051218238056bc75e2d63100000a9842075a90413a051218238056bc75e2d63100000a9842077a90413a051218238056bc75e2d63100000a9842079a90413a0598238056bc75e2d631000002400428238410d586a20a4c00000a98412a08238056bc75e2d63100000a984018064a984001ca984800ba904a0aa00a08064a904")?;
        assert_eq!(lib_cell.hash()?, &lib_id);
        let libs_dict = LibsDict::new([lib_cell.clone()])?;
        let dict_cell = libs_dict.to_cell()?;
        let mut parser = dict_cell.parser();
        assert_eq!(parser.read_num::<u32>(2)?, 0b10); // LabelType::Long
        assert_eq!(parser.read_num::<u32>(9)?, 256); // label_len
        let parsed_key = parser.read_bits(256)?;
        assert_eq!(parsed_key.as_slice(), lib_id.as_slice());
        let lib_cell_parsed = parser.read_next_ref()?;
        assert_eq!(lib_cell_parsed.hash()?, &lib_id);
        Ok(())
    }
}