/// Errors produced by IP Flag APIs.
///
/// This crate can fail in two ways:
/// 1) IP parsing fails (`InvalidIp`)
/// 2) The user-provided resolver fails (`Resolver`)
///
/// The resolver error type is generic so that each resolver can expose its own
/// error enum without being forced into a boxed error.
///
/// # Example
///
/// ```rust
/// use ipflag::{IpflagError, tag_ip, NoopResolver};
///
/// let err = tag_ip(&NoopResolver, "not-an-ip").unwrap_err();
/// match err {
/// IpflagError::InvalidIp(_) => {}
/// _ => panic!("expected InvalidIp"),
/// }
/// ```