1// Rust Levin Library
2// Written in 2023 by
3// Cuprate Contributors
4//
5// Permission is hereby granted, free of charge, to any person obtaining a copy
6// of this software and associated documentation files (the "Software"), to deal
7// in the Software without restriction, including without limitation the rights
8// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9// copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in all
13// copies or substantial portions of the Software.
14//
1516//! This module defines the addresses that will get passed around the
17//! Monero network. Core Monero has 4 main addresses: IPv4, IPv6, Tor,
18//! I2p. Currently this module only has IPv(4/6).
19//!
20use std::{hash::Hash, net, net::SocketAddr};
2122use bytes::BufMut;
2324use cuprate_epee_encoding::EpeeObject;
2526mod epee_builder;
27use epee_builder::*;
2829#[derive(Debug, PartialEq, Eq, Clone, Copy)]
30pub enum NetZone {
31 Public,
32 Tor,
33 I2p,
34}
3536/// A network address which can be encoded into the format required
37/// to send to other Monero peers.
38#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
39pub enum NetworkAddress {
40 Clear(SocketAddr),
41}
4243impl EpeeObject for NetworkAddress {
44type Builder = TaggedNetworkAddress;
4546fn number_of_fields(&self) -> u64 {
472
48}
4950fn write_fields<B: BufMut>(self, w: &mut B) -> cuprate_epee_encoding::Result<()> {
51 TaggedNetworkAddress::from(self).write_fields(w)
52 }
53}
5455impl NetworkAddress {
56pub const fn get_zone(&self) -> NetZone {
57match self {
58Self::Clear(_) => NetZone::Public,
59 }
60 }
6162pub const fn is_loopback(&self) -> bool {
63// TODO
64false
65}
6667pub const fn is_local(&self) -> bool {
68// TODO
69false
70}
7172pub const fn port(&self) -> u16 {
73match self {
74Self::Clear(ip) => ip.port(),
75 }
76 }
77}
7879impl From<net::SocketAddrV4> for NetworkAddress {
80fn from(value: net::SocketAddrV4) -> Self {
81Self::Clear(value.into())
82 }
83}
8485impl From<net::SocketAddrV6> for NetworkAddress {
86fn from(value: net::SocketAddrV6) -> Self {
87Self::Clear(value.into())
88 }
89}
9091impl From<SocketAddr> for NetworkAddress {
92fn from(value: SocketAddr) -> Self {
93match value {
94 SocketAddr::V4(v4) => v4.into(),
95 SocketAddr::V6(v6) => v6.into(),
96 }
97 }
98}
99100#[derive(Debug, Copy, Clone, Eq, PartialEq, thiserror::Error)]
101#[error("Network address is not in the correct zone")]
102pub struct NetworkAddressIncorrectZone;
103104impl TryFrom<NetworkAddress> for SocketAddr {
105type Error = NetworkAddressIncorrectZone;
106fn try_from(value: NetworkAddress) -> Result<Self, Self::Error> {
107match value {
108 NetworkAddress::Clear(addr) => Ok(addr),
109//_ => Err(NetworkAddressIncorrectZone)
110}
111 }
112}