gai-core 0.1.5

Pure parsing + simulation of Linux name-resolution config (nsswitch.conf, resolv.conf, gai.conf, hosts) — no I/O. Core of the gai CLI.
Documentation

gai-core: pure logic for parsing the OS name-resolution configuration and simulating the getaddrinfo() decision path.

No network I/O, no process interception. Everything here is testable against fixture files, which is the whole point of keeping it separate from gai-probe, which supplies real answers over the network/D-Bus.

Example

use gai_core::sim::{simulate, SourceResolver};
use gai_core::types::{NssEntry, NssSource, NsswitchConfig, StepResult};

// A resolver that always finds an answer via DNS — in real use this
// would be gai-probe's SystemSourceResolver, doing actual I/O.
struct AlwaysDns;
impl SourceResolver for AlwaysDns {
    fn resolve(&mut self, source: &NssSource, _name: &str) -> StepResult {
        match source {
            NssSource::Dns => StepResult::Found(vec!["93.184.216.34".parse().unwrap()]),
            _ => StepResult::NotFound,
        }
    }
}

let config = NsswitchConfig {
    hosts: vec![
        NssEntry { source: NssSource::Files, criteria: vec![] },
        NssEntry { source: NssSource::Dns, criteria: vec![] },
    ],
};

let outcome = simulate(&config, "example.com", &mut AlwaysDns);
assert!(outcome.resolved());
assert_eq!(outcome.steps.len(), 2, "files was tried and fell through to dns");