use std::{
cell::RefCell,
collections::HashMap,
pin::Pin,
rc::{Rc, Weak},
};
use crew_rs::{CredentialSource, CrewManager, SimpleCredentialSource};
use endr::{Remote, StorageBackend};
use futures::{future, Future, FutureExt, Stream, StreamExt};
use mofo::Mofo;
use crate::{Doc, DocID, TeamID, doc::WeakDoc};
struct TlptInner {
endr: endr::Node,
croo: CrewManager,
pub(crate) docs: HashMap<DocID, WeakDoc>,
account: Option<TeamID>,
background: Mofo,
}
#[derive(Clone)]
pub struct Tlpt(Rc<RefCell<TlptInner>>);
#[derive(Clone)]
pub(crate) struct WeakTlpt(Weak<RefCell<TlptInner>>);
impl WeakTlpt {
pub fn upgrade(&self) -> Option<Tlpt> {
self.0.upgrade().map(Tlpt)
}
}
impl Tlpt {
pub fn new(
name: String,
background: Mofo,
endr: endr::Node,
credential_source: Box<dyn CredentialSource>,
account: Option<TeamID>,
) -> Self {
let croo = CrewManager::new(
endr.clone(),
background.clone(),
credential_source,
);
let tlpt = Tlpt(Rc::new(RefCell::new(TlptInner {
endr,
croo,
docs: HashMap::new(),
account,
background,
})));
tlpt
}
pub(crate) fn weak_ref(&self) -> WeakTlpt {
WeakTlpt(Rc::downgrade(&self.0))
}
pub(crate) fn croo(&self) -> CrewManager {
self.0.borrow().croo.clone()
}
pub(crate) fn endr(&self) -> endr::Node {
self.0.borrow().endr.clone()
}
pub(crate) fn background(&self) -> Mofo {
self.0.borrow().background.clone()
}
pub(crate) fn account(&self) -> Option<TeamID> {
self.0.borrow().account.clone()
}
pub(crate) fn get_doc(&self, doc_id: &DocID) -> Option<Doc> {
self.0.borrow().docs.get(doc_id).and_then(|weak| weak.upgrade())
}
pub(crate) fn insert_doc(&self, doc: Doc) {
self.0.borrow_mut().docs.insert(doc.id(), doc.as_weak());
}
pub async fn add_remote(&self, remote: Remote) {
self.endr().add_remote(remote).await;
}
}