maxminddb_writer/
metadata.rs1use 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}