use fastly::{Error, Request, Response};
use std::net::{IpAddr, Ipv4Addr};

const BACKEND_NAME: &str = "origin_0";

#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {
    let client_ip_opt = Request::get_client_ip_addr(&req);
 
    if let Some(ip) = client_ip_opt {
        let ip_v4 = get_ipv4(&ip);
        req.set_header("x-ipv4", ip_v4.to_string());
    }

    Ok(req.send(BACKEND_NAME)?)
}

fn get_ipv4(ip: &IpAddr) -> IpAddr {
    match ip {
        IpAddr::V4(ip) => IpAddr::V4(*ip),
        IpAddr::V6(ip) => {
            let digest = md5::compute(ip.octets());
            // Map a v6 IP hash to a consistent Class E v4 IP.
            IpAddr::V4(Ipv4Addr::new(
                0xf0 | digest[0],
                digest[1],
                digest[2],
                digest[3],
            ))
        }
    }
}