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

const KEEP_IPV4_BYTES: usize = 3;
const KEEP_IPV6_BYTES: usize = 6;

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
    log_fastly::init_simple("mylogs", log::LevelFilter::Info);
    if let Some(ip) = req.get_client_ip_addr() {
        let anon = anonymize(&ip);
        log::info!("IP {} anonymized to {}", ip, anon);
    } else {
        log::info!("could not find client ip");
    }
    Ok(Response::new())
}

fn anonymize(ip: &IpAddr) -> IpAddr {
    match ip {
        IpAddr::V4(ip) => {
            let mut o = ip.octets();
            o[KEEP_IPV4_BYTES..].copy_from_slice(&[0; 4 - KEEP_IPV4_BYTES]);
            IpAddr::V4(o.into())
        }
        IpAddr::V6(ip) => {
            let mut o = ip.octets();
            o[KEEP_IPV6_BYTES..].copy_from_slice(&[0; 16 - KEEP_IPV6_BYTES]);
            IpAddr::V6(o.into())
        }
    }
}