// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use {
    fidl_fuchsia_hardware_vsock::Addr as Raw,
    std::{
        hash::{Hash, Hasher},
        ops::{Deref, DerefMut},
    },
};

#[derive(Debug)]
pub struct Vsock {
    inner: Raw,
}

impl From<Raw> for Vsock {
    fn from(addr: Raw) -> Self {
        Vsock { inner: addr }
    }
}

impl PartialEq for Vsock {
    fn eq(&self, other: &Self) -> bool {
        self.inner.local_port == other.inner.local_port
            && self.inner.remote_port == other.inner.remote_port
            && self.inner.remote_cid == other.inner.remote_cid
    }
}

impl Eq for Vsock {}

impl Hash for Vsock {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.inner.local_port.hash(state);
        self.inner.remote_port.hash(state);
        self.inner.remote_cid.hash(state);
    }
}

impl Deref for Vsock {
    type Target = Raw;
    fn deref(&self) -> &Self::Target {
        &self.inner
    }
}

impl DerefMut for Vsock {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.inner
    }
}

impl Clone for Vsock {
    fn clone(&self) -> Self {
        Vsock {
            inner: Raw {
                local_port: self.inner.local_port,
                remote_port: self.inner.remote_port,
                remote_cid: self.inner.remote_cid,
            },
        }
    }
}

impl Vsock {
    pub fn new(local_port: u32, remote_port: u32, remote_cid: u32) -> Vsock {
        Vsock {
            inner: Raw {
                local_port,
                remote_port,
                remote_cid,
            },
        }
    }
}
