ip2location-bin-format 0.4.0

IP2Location BIN Format
Documentation
use std::net::Ipv6Addr;

use super::{builder::Builder, inner::Inner};
use crate::{
    index::{ipv6_addr_position, INDEX_ELEMENT_LEN},
    records::PositionRange,
};

//
#[derive(Debug)]
pub struct V6Querier {
    inner: Inner,
}

impl From<Vec<u8>> for V6Querier {
    fn from(bytes: Vec<u8>) -> Self {
        Self {
            inner: Inner::new(bytes),
        }
    }
}

impl V6Querier {
    //
    pub fn builder() -> Builder {
        Builder::new()
    }

    //
    pub fn query(&self, ip: Ipv6Addr) -> PositionRange {
        debug_assert!(ip.to_ipv4().is_none());

        let position = ipv6_addr_position(ip) as usize;

        let start = u32::from_ne_bytes(
            self.inner.bytes[position..position + INDEX_ELEMENT_LEN as usize]
                .try_into()
                .unwrap(),
        );
        let end = u32::from_ne_bytes(
            self.inner.bytes[position + INDEX_ELEMENT_LEN as usize
                ..position + INDEX_ELEMENT_LEN as usize + INDEX_ELEMENT_LEN as usize]
                .try_into()
                .unwrap(),
        );

        PositionRange::new(start, end)
    }
}