cloud-meta 0.2.0

Cloud metadata client
Documentation
use std::time::Duration;
use anyhow::Result;
use hyper::Client;
use tokio::time::sleep;
use cloud_meta::{*, cloud::*};

#[derive(Debug)]
pub enum Cloud {
    Amazon(amazon::Instance),
    Azure(azure::Instance),
    Google(google::Instance),
    Oracle(oracle::Instance),
}

#[tokio::main]
async fn main() -> Result<()> {
    let client = Client::new();

    let amazon = Amazon::new(client.clone());
    let azure  = Azure::new(client.clone());
    let google = Google::new(client.clone());
    let oracle = Oracle::new(client.clone());

    let amazon = async {
        let ttl   = Duration::from_secs(60);
        let token = amazon.token(ttl).await.ok();
        amazon.instance(token.as_deref()).await
    };

    let azure   = azure.instance();
    let google  = google.instance();
    let oracle  = oracle.instance();
    let timeout = sleep(Duration::from_secs(2));

    let cloud = tokio::select! {
        Ok(instance) = amazon  => Some(Cloud::Amazon(instance)),
        Ok(instance) = azure   => Some(Cloud::Azure(instance)),
        Ok(instance) = google  => Some(Cloud::Google(instance)),
        Ok(instance) = oracle  => Some(Cloud::Oracle(instance)),
        _            = timeout => None,
    };

    println!("cloud: {:?}", cloud);

    Ok(())
}