diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-02-08 16:46:41 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-02-10 11:23:23 +0100 |
| commit | c13a0bd69ddd12121c18b130e8f91f64cf9a04a0 (patch) | |
| tree | fe2597bab2c8c80638cd41873f06711e0d864d8a | |
| parent | 7b68e34745ee18081223c706f48b5bc2ed2fc9e9 (diff) | |
| download | mullvadvpn-c13a0bd69ddd12121c18b130e8f91f64cf9a04a0.tar.xz mullvadvpn-c13a0bd69ddd12121c18b130e8f91f64cf9a04a0.zip | |
Add Providers type
| -rw-r--r-- | mullvad-types/src/relay_constraints.rs | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/mullvad-types/src/relay_constraints.rs b/mullvad-types/src/relay_constraints.rs index a5a60f5921..150bf770a4 100644 --- a/mullvad-types/src/relay_constraints.rs +++ b/mullvad-types/src/relay_constraints.rs @@ -9,7 +9,7 @@ use crate::{ #[cfg(target_os = "android")] use jnix::{FromJava, IntoJava}; use serde::{Deserialize, Serialize}; -use std::fmt; +use std::{collections::HashSet, fmt}; use talpid_types::net::{openvpn::ProxySettings, TransportProtocol, TunnelType}; @@ -308,6 +308,52 @@ impl Match<Relay> for LocationConstraint { /// provider. pub type Provider = String; +#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] +pub struct Providers { + providers: HashSet<Provider>, +} + +/// Returned if the iterator contained no providers. +pub struct NoProviders(()); + +impl Providers { + pub fn new(providers: impl Iterator<Item = Provider>) -> Result<Providers, NoProviders> { + let providers = Providers { + providers: providers.collect(), + }; + if providers.providers.is_empty() { + return Err(NoProviders(())); + } + Ok(providers) + } +} + +impl Match<Relay> for Providers { + fn matches(&self, relay: &Relay) -> bool { + self.providers.contains(&relay.provider) + } +} + +impl From<Providers> for Vec<Provider> { + fn from(providers: Providers) -> Vec<Provider> { + providers.providers.into_iter().collect() + } +} + +impl fmt::Display for Providers { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { + write!(f, "provider(s) ")?; + for (i, provider) in self.providers.iter().enumerate() { + if i == 0 { + write!(f, "{}", provider)?; + } else { + write!(f, ", {}", provider)?; + } + } + Ok(()) + } +} + impl fmt::Display for LocationConstraint { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { match self { |
