Skip to main content

VendorResolver

Struct VendorResolver 

Source
pub struct VendorResolver { /* private fields */ }
Expand description

Vendor-to-playbook resolver.

Construct with VendorResolver::with_builtin_defaults to load the four baseline rules shipped in crates/stygian-charon/data/vendor_playbook_rules/, or VendorResolver::from_rules for an empty / custom bundle.

The resolver is stateless and Send + Sync so it can be shared across threads and requests without locking.

§Example

use stygian_charon::vendor_classifier::VendorClassifier;
use stygian_charon::vendor_resolver::{StrategyMarker, VendorResolver};

let resolver = VendorResolver::with_builtin_defaults();
let classifier = VendorClassifier::with_builtin_defaults();
let c = classifier.classify(
    &[],
    &std::collections::BTreeMap::new(),
    Some("harmless html"),
    "https://example.com/",
);
let r = resolver.resolve(&c);
// A clean HAR reports Unknown with confidence 0.0; the resolver
// routes that through the tier1-static rule (Unknown vendor).
assert!(r.is_resolved() || r.is_manual());

Implementations§

Source§

impl VendorResolver

Source

pub fn from_rules<I>(rules: I) -> Result<Self, VendorResolverError>
where I: IntoIterator<Item = ResolutionRule>,

Build a resolver from a pre-loaded list of ResolutionRule entries.

The rules are validated, deduplicated by id, and sorted by (priority ASC, id ASC) so the resolver’s deterministic iteration order is independent of the caller’s input order.

§Errors

Returns VendorResolverError on the first invalid rule or on duplicate ids.

Source

pub fn with_builtin_defaults() -> Self

Build a resolver seeded with the four baseline rules embedded at compile time from crates/stygian-charon/data/vendor_playbook_rules/.

The compile-time check compile_check_builtin_resolution_rules guarantees that every embedded TOML is valid; if it regresses, the build will fail.

§Panics

Panics if any embedded baseline TOML fails to parse or validate. This is a compile-time failure guarded by the compile_check_builtin_resolution_rules test; the panic in production surfaces a regression in the embedded data as a hard startup error.

§Example
use stygian_charon::vendor_resolver::VendorResolver;

let resolver = VendorResolver::with_builtin_defaults();
assert!(resolver.contains("tier2-hostile"));
assert!(resolver.contains("tier1-js-cloudflare"));
assert!(resolver.contains("tier1-static"));
assert!(resolver.contains("default-manual"));
Source

pub fn contains(&self, id: &str) -> bool

true when the resolver has a rule with the given id.

Source

pub const fn len(&self) -> usize

Number of rules currently registered.

Source

pub const fn is_empty(&self) -> bool

true when no rules are registered.

Source

pub fn rule_ids(&self) -> Vec<String>

Ids of all registered rules, in priority order.

Source

pub fn resolve(&self, classification: &VendorClassification) -> VendorResolution

Resolve a VendorClassification into a VendorResolution.

The resolver iterates the rules in priority order (lowest priority number first) and fires the first rule whose confidence and score gates pass. See the module-level docs for the full resolution flow.

§Example
use stygian_charon::vendor_classifier::VendorClassifier;
use stygian_charon::vendor_resolver::VendorResolver;

let resolver = VendorResolver::with_builtin_defaults();
let classifier = VendorClassifier::with_builtin_defaults();
let cookies = vec!["datadome=abc; Path=/".to_string()];
let mut headers = std::collections::BTreeMap::new();
headers.insert("x-datadome".to_string(), "protected".to_string());
let c = classifier.classify(&cookies, &headers, None, "https://example.com/");
let r = resolver.resolve(&c);
assert!(r.is_resolved());
Source

pub fn resolve_with_playbooks( &self, classification: &VendorClassification, playbook_resolver: &PlaybookResolver, overrides: &PlaybookOverrides, ) -> Result<Option<ResolvedPlaybook>, ValidationError>

Convenience helper that resolves a classification and then resolves the matched playbook through a PlaybookResolver.

Returns None when the resolver returned the Manual strategy marker, mirroring the “non-breaking integration with existing manual mode selection” guarantee — the caller keeps its manual mode selection rather than receiving a ResolvedPlaybook.

§Errors

Returns crate::playbooks::ValidationError when the resolver picked a playbook id the PlaybookResolver does not have registered.

Trait Implementations§

Source§

impl Clone for VendorResolver

Source§

fn clone(&self) -> VendorResolver

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VendorResolver

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more