maxminddb_writer/
metadata.rs

1use std::collections::HashMap;
2
3pub(crate) const METADATA_START_MARKER: &[u8] = b"\xab\xcd\xefMaxMind.com";
4
5#[derive(Clone, Copy, Debug)]
6pub enum RecordSize {
7    Small,
8    Medium,
9    Large,
10}
11
12impl RecordSize {
13    pub fn choose(max_ptr_value: usize) -> Self {
14        if max_ptr_value < 1 << 24 {
15            RecordSize::Small
16        } else if max_ptr_value < 1 << 28 {
17            RecordSize::Medium
18        } else {
19            RecordSize::Large
20        }
21    }
22}
23
24impl serde::Serialize for RecordSize {
25    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
26        match self {
27            RecordSize::Small => 24u16.serialize(serializer),
28            RecordSize::Medium => 28u16.serialize(serializer),
29            RecordSize::Large => 32u16.serialize(serializer),
30        }
31    }
32}
33
34#[derive(Clone, Copy, Debug)]
35pub enum IpVersion {
36    V4,
37    V6,
38}
39
40impl serde::Serialize for IpVersion {
41    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
42        match self {
43            IpVersion::V4 => 4u16.serialize(serializer),
44            IpVersion::V6 => 6u16.serialize(serializer),
45        }
46    }
47}
48
49#[derive(Clone, Debug, serde::Serialize)]
50pub struct Metadata {
51    pub(crate) node_count: u32,
52    pub(crate) record_size: RecordSize,
53    pub ip_version: IpVersion,
54    pub database_type: String,
55    pub languages: Vec<String>,
56    pub binary_format_major_version: u16,
57    pub binary_format_minor_version: u16,
58    pub build_epoch: u64,
59    pub description: HashMap<String, String>,
60}
61
62impl Default for Metadata {
63    fn default() -> Self {
64        Metadata {
65            node_count: 0,
66            record_size: RecordSize::Small,
67            ip_version: IpVersion::V4,
68            database_type: String::new(),
69            languages: Vec::new(),
70            binary_format_major_version: 0,
71            binary_format_minor_version: 0,
72            build_epoch: 0,
73            description: HashMap::new(),
74        }
75    }
76}