saml-rs 0.2.1

Pure-Rust SAML 2.0 Service Provider and Identity Provider support.
Documentation
use saml_rs::{
    AcsEndpoint, AuthnRequest, EndpointUrl, EntityId, Idp, LogoutBinding, LogoutRequest, MessageId,
    NameIdCreationRequest, PendingAuthnRequest, PendingLogoutRequest, PendingSnapshot,
    RelayStateParam, Saml, SamlError, SamlInstant, SloEndpoint, Sp, SsoEndpoint, SsoRequestBinding,
    SsoResponseBinding,
};

fn assert_send_sync<T: Send + Sync>() {}

#[test]
fn typed_api_contract_exposes_role_markers() {
    assert_send_sync::<Saml<Sp>>();
    assert_send_sync::<Saml<Idp>>();
    let _: Option<SamlError> = None;
}

#[test]
fn typed_api_contract_reexports_raw_flow_types() {
    let _ = std::any::type_name::<saml_rs::raw::Binding>();
    let _ = std::any::type_name::<saml_rs::raw::FlowResult>();
    let _ = std::any::type_name::<saml_rs::raw::BindingContext>();
    let _ = std::any::type_name::<saml_rs::raw::HttpRequest>();
}

#[test]
fn typed_api_contract_reexports_config_builders() {
    let _ = std::any::type_name::<saml_rs::SpConfigBuilder>();
    let _ = std::any::type_name::<saml_rs::IdpConfigBuilder>();
    let _ = std::any::type_name::<saml_rs::AuthnRequestSigningPolicy>();
    let _ = std::any::type_name::<saml_rs::AuthnRequestValidationPolicy>();
}

#[test]
fn typed_api_contract_reexports_typed_binding_building_blocks(
) -> Result<(), Box<dyn std::error::Error>> {
    assert_send_sync::<SsoRequestBinding>();
    assert_send_sync::<SsoResponseBinding>();
    assert_send_sync::<LogoutBinding>();
    assert_send_sync::<EndpointUrl>();
    assert_send_sync::<SsoEndpoint>();
    assert_send_sync::<AcsEndpoint>();
    assert_send_sync::<SloEndpoint>();
    assert_send_sync::<MessageId>();
    assert_send_sync::<RelayStateParam>();
    assert_send_sync::<SamlInstant>();
    assert_send_sync::<PendingAuthnRequest>();
    assert_send_sync::<PendingSnapshot<AuthnRequest>>();
    assert_send_sync::<PendingLogoutRequest>();
    assert_send_sync::<PendingSnapshot<LogoutRequest>>();
    assert_send_sync::<NameIdCreationRequest>();

    let acs = AcsEndpoint::post("https://sp.example.com/acs")?;
    let pending = PendingAuthnRequest::try_new(
        MessageId::try_new("_request123")?,
        RelayStateParam::try_from_option(Some("relay".to_string()))?,
        acs,
        SsoResponseBinding::Post,
        EntityId::try_new("https://idp.example.com/metadata")?,
    )?;
    let _: PendingSnapshot<AuthnRequest> = pending.snapshot();
    let logout_pending = PendingLogoutRequest::try_new(
        MessageId::try_new("_logout123")?,
        RelayStateParam::present_empty(),
        LogoutBinding::Redirect,
        EntityId::try_new("https://idp.example.com/metadata")?,
    )?;
    let _: PendingSnapshot<LogoutRequest> = logout_pending.snapshot();
    let _ = SsoEndpoint::redirect("https://idp.example.com/sso")?;
    let _ = SloEndpoint::new(
        LogoutBinding::Redirect,
        EndpointUrl::try_new("https://idp.example.com/slo")?,
    );
    let _ = SsoRequestBinding::Redirect;
    Ok(())
}

#[test]
fn typed_api_contract_reexports_browser_and_model_types() {
    let _ = std::any::type_name::<saml_rs::BrowserInput<saml_rs::AuthnRequest>>();
    let _ = std::any::type_name::<saml_rs::FormField>();
    let _ = std::any::type_name::<saml_rs::Outbound<saml_rs::AuthnRequest>>();
    let _ = std::any::type_name::<saml_rs::Pending<saml_rs::AuthnRequest>>();
    let _ = std::any::type_name::<saml_rs::PostForm>();
    let _ = std::any::type_name::<saml_rs::Started<saml_rs::AuthnRequest>>();
    let _ = std::any::type_name::<saml_rs::Assertion>();
    let _ = std::any::type_name::<saml_rs::AssertionId>();
    let _ = std::any::type_name::<saml_rs::Attribute>();
    let _ = std::any::type_name::<saml_rs::AttributeValue>();
    let _ = std::any::type_name::<saml_rs::Attributes>();
    let _ = std::any::type_name::<saml_rs::AuthnSession>();
    let _ = std::any::type_name::<saml_rs::LogoutCompleted>();
    let _ = std::any::type_name::<saml_rs::LogoutRequest>();
    let _ = std::any::type_name::<saml_rs::LogoutResponse>();
    let _ = std::any::type_name::<saml_rs::NameId>();
    let _ = std::any::type_name::<saml_rs::NameIdPolicy>();
    let _ = std::any::type_name::<saml_rs::Received<saml_rs::SsoResponse>>();
    let _ = std::any::type_name::<saml_rs::RelayState>();
    let _ = saml_rs::MAX_RELAY_STATE_BYTES;
    let _ = std::any::type_name::<saml_rs::SessionIndex>();
    let _ = std::any::type_name::<saml_rs::SsoResponse>();
    let _ = std::any::type_name::<saml_rs::SsoSession>();
    let _ = std::any::type_name::<saml_rs::Subject>();
    let _ = std::any::type_name::<saml_rs::SubjectConfirmation>();
}