use anyhow::Result;
use azure_devops_rust_api::git;
use std::env;
use std::sync::Arc;
use async_trait::async_trait;
use azure_core::{Context, Policy, PolicyResult, Request};
use env_logger::Env;
use log::info;
mod utils;
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct RequestLogger {}
impl RequestLogger {
fn new() -> Self {
Default::default()
}
}
#[async_trait]
impl azure_core::Policy for RequestLogger {
async fn send(
&self,
ctx: &Context,
request: &mut Request,
next: &[Arc<dyn Policy>],
) -> PolicyResult {
info!("> Request:\n{:#?}", request);
let now = time::Instant::now();
let rsp = next[0].send(ctx, request, &next[1..]).await;
let elapsed_time = now.elapsed();
info!("Request took {} secs", elapsed_time.as_seconds_f32());
info!("< Response:\n{:#?}", rsp);
rsp
}
}
#[tokio::main]
async fn main() -> Result<()> {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let credential = utils::get_credential();
let organization = env::var("ADO_ORGANIZATION").expect("Must define ADO_ORGANIZATION");
let project = env::var("ADO_PROJECT").expect("Must define ADO_PROJECT");
let request_logger_policy = Arc::new(RequestLogger::new()) as Arc<dyn Policy>;
let git_client = git::ClientBuilder::new(credential)
.per_call_policies(vec![request_logger_policy])
.build();
let _repos = git_client
.repositories_client()
.list(organization, project)
.await?
.value;
Ok(())
}