# parlov-core
Shared types for HTTP oracle detection. Zero I/O, zero async — just data structures.
## types
```rust
use parlov_core::{ResponseSurface, ProbeDefinition, ProbeSet, OracleResult};
```
**`ResponseSurface`** — one captured HTTP interaction:
```rust
pub struct ResponseSurface {
pub status: StatusCode,
pub headers: HeaderMap,
pub body: Bytes,
pub timing_ns: u64,
}
```
**`ProbeDefinition`** — one HTTP request to execute:
```rust
pub struct ProbeDefinition {
pub url: String,
pub method: Method,
pub headers: HeaderMap, // auth context lives here
pub body: Option<Bytes>,
}
```
**`ProbeSet`** — paired surfaces for differential analysis:
```rust
pub struct ProbeSet {
pub baseline: Vec<ResponseSurface>, // known-valid input
pub probe: Vec<ResponseSurface>, // suspect input
}
```
**`OracleResult`** — the analysis output:
```rust
pub struct OracleResult {
pub class: OracleClass, // Existence, Authentication, Timing, ...
pub verdict: OracleVerdict, // Confirmed / Likely / NotPresent
pub evidence: Vec<String>, // "403 (baseline) vs 404 (probe)"
pub severity: Option<Severity>, // High / Medium / Low
}
```
All types derive `Serialize` and `Deserialize` with custom serde helpers for `StatusCode`, `Method`, and `HeaderMap` (the `http` crate types lack native serde support).
## use it
Construct a probe set from captured HTTP interactions:
```rust
use parlov_core::{ProbeSet, ResponseSurface};
use bytes::Bytes;
use http::{HeaderMap, StatusCode};
let baseline = ResponseSurface {
status: StatusCode::FORBIDDEN,
headers: HeaderMap::new(),
body: Bytes::new(),
timing_ns: 12_500_000,
};
let probe = ResponseSurface {
status: StatusCode::NOT_FOUND,
headers: HeaderMap::new(),
body: Bytes::new(),
timing_ns: 11_800_000,
};
let probe_set = ProbeSet {
baseline: vec![baseline],
probe: vec![probe],
};
```
Build a request definition for the probe engine:
```rust
use parlov_core::ProbeDefinition;
use http::{Method, HeaderMap};
let def = ProbeDefinition {
url: "https://api.example.com/users/123".into(),
method: Method::GET,
headers: HeaderMap::new(),
body: None,
};
```
## errors
```rust
use parlov_core::Error;
```
Three variants via `thiserror`: `Http(String)`, `Analysis(String)`, `Serialization(serde_json::Error)`.
## license
MIT OR Apache-2.0