Files
inbuxa-migrate/src/jmap/connect.rs
T

70 lines
1.9 KiB
Rust

/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*/
use crate::error::Error;
use crate::jmap::account;
use crate::jmap::session::{Limits, Session};
use crate::sync::{ConnectConfig, Context};
use crate::types::ObjectType;
pub struct Connected {
pub session: Session,
pub limits: Limits,
pub account_id: String,
supported: Vec<ObjectType>,
}
impl Connected {
pub fn supports(&self, ty: ObjectType) -> bool {
self.supported.contains(&ty)
}
pub fn supported_types(&self) -> &[ObjectType] {
&self.supported
}
}
pub fn prepare(ctx: &Context, connect: &ConnectConfig) -> Result<Connected, Error> {
ctx.client.set_logger(ctx.common.logger);
let session = Session::discover(&ctx.client, &connect.url)?;
for mismatch in session.origin_mismatches(&connect.url) {
ctx.common.logger.warn(&mismatch.to_string());
}
let limits = session.core_limits()?;
ctx.client.set_limits(&limits);
let account_id = account::resolve(&connect.account, &session, &ctx.client)?;
if session.account(&account_id).is_none()
&& !matches!(connect.account, account::AccountSelector::Name(_))
{
ctx.common.logger.warn(&format!(
"account id {account_id} is not enumerated in this session; capabilities cannot be gated and every type will be attempted"
));
}
let mut supported = Vec::new();
for ty in ObjectType::ALL {
let urn = ty.capability_urn();
let known = session.account(&account_id).is_some();
if !known || session.supports(&account_id, urn) {
supported.push(ty);
} else {
ctx.common.logger.warn(&format!(
"target account does not advertise {urn}; skipping type {}",
ty.jmap_name()
));
}
}
Ok(Connected {
session,
limits,
account_id,
supported,
})
}