summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-02-08 16:46:41 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-02-10 11:23:23 +0100
commitc13a0bd69ddd12121c18b130e8f91f64cf9a04a0 (patch)
treefe2597bab2c8c80638cd41873f06711e0d864d8a
parent7b68e34745ee18081223c706f48b5bc2ed2fc9e9 (diff)
downloadmullvadvpn-c13a0bd69ddd12121c18b130e8f91f64cf9a04a0.tar.xz
mullvadvpn-c13a0bd69ddd12121c18b130e8f91f64cf9a04a0.zip
Add Providers type
-rw-r--r--mullvad-types/src/relay_constraints.rs48
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 {