use std::sync::Arc;
use bytesbuf::mem::GlobalPool;
use fetch::HttpClient;
use fetch::tls::TlsOptions;
use ohno::ErrorExt;
use opentelemetry_sdk::metrics::SdkMeterProvider;
use rustls::client::danger::ServerCertVerifier;
use rustls::crypto::CryptoProvider;
use tick::Clock;
#[fundle::bundle]
struct App {
clock: Clock,
global_pool: GlobalPool,
client: HttpClient,
}
fn custom_verifier(provider: Arc<CryptoProvider>) -> Arc<dyn ServerCertVerifier> {
Arc::new(
rustls_platform_verifier::Verifier::new(provider)
.expect("the platform certificate verifier must initialize with the supplied crypto provider"),
)
}
#[tokio::main]
async fn main() -> Result<(), ohno::AppError> {
let meter_provider = initialize_meter_provider();
let app = App::builder()
.clock(|_| Clock::new_tokio())
.global_pool(|_| GlobalPool::new())
.client({
let meter_provider = meter_provider.clone();
move |x| {
HttpClient::builder_tokio(x)
.meter_provider(&meter_provider)
.tls_options(TlsOptions::builder_rustls().server_certificate_verifier(custom_verifier).build())
.build()
}
})
.build();
match app.client.get("https://www.example.com").fetch().await {
Ok(response) => {
println!("response success, status: {}", response.status());
}
Err(e) => {
println!("response error, message: {}", e.message());
}
}
Ok(())
}
fn initialize_meter_provider() -> SdkMeterProvider {
SdkMeterProvider::builder()
.with_periodic_exporter(opentelemetry_stdout::MetricExporter::default())
.build()
}