plane_drone/
ip.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::net::IpAddr;

#[derive(Serialize, Deserialize)]
#[serde(untagged)]
pub enum IpSource {
    Literal(IpAddr),
    Api { api: String },
}

impl IpSource {
    pub async fn get_ip(&self) -> Result<IpAddr> {
        match self {
            IpSource::Literal(ip) => Ok(*ip),
            IpSource::Api { api } => {
                let result = reqwest::get(api).await?.text().await?;
                let ip: IpAddr = result.parse()?;
                Ok(ip)
            }
        }
    }
}