Files
oott/src/mac_vendor_finder.rs
T

55 lines
1.6 KiB
Rust
Raw Normal View History

use log::{debug, error, info};
2026-01-19 12:45:52 -05:00
use serde::Deserialize;
use std::collections::HashMap;
use std::fs;
use std::sync::LazyLock;
2026-01-19 12:45:52 -05:00
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct MacRecord {
pub mac_prefix: String,
pub vendor_name: String,
// private: bool,
// block_type: String,
// last_update: String,
}
// Initialize mac vendors database as a static lazy loaded unit
static MAC_VENDORS_DATABASE: LazyLock<HashMap<String, String>> = LazyLock::new(|| {
info!("Loading MAC vendor database into memory");
2026-01-19 12:45:52 -05:00
let mut database = HashMap::new();
let data = match fs::read_to_string("data/mac-vendors-export.json") {
Ok(value) => value,
Err(error) => {
error!("Error reading mac vendors database (data/mac-vendors-export.json): {error}");
panic!("Error reading mac vendors database (data/mac-vendors-export.json): {error}");
2026-01-19 12:45:52 -05:00
}
};
2026-01-19 12:45:52 -05:00
let json: Vec<MacRecord> = match serde_json::from_str(&data) {
Ok(value) => value,
Err(error) => {
error!("Error parsing mac vendors database (data/mac-vendors-export.json): {error}");
panic!("Error parsing mac vendors database (data/mac-vendors-export.json): {error}");
2026-01-19 12:45:52 -05:00
}
};
debug!("Found {} records in the database", json.len());
for el in json {
database.insert(el.mac_prefix.to_uppercase(), el.vendor_name);
2026-01-19 12:45:52 -05:00
}
info!("MAC vendor database loaded");
database
});
// Find a vendor based on the MAC prefix
pub fn find(mac_prefix: String) -> String {
MAC_VENDORS_DATABASE
.get(&mac_prefix.to_uppercase())
.unwrap_or(&"".to_string())
.to_string()
2026-01-19 12:45:52 -05:00
}