//! Optional hosted transport state. The Document remains the local editing history. pub mod client; pub mod view; use client::{Catalog, Connection, Failure, Remote, Secret, Summary}; use oa_core::{Id, source_project::CompiledSourceProject}; use std::sync::Arc; #[derive(Debug, Clone)] pub enum Event { Show, Close, Base(String), Token(Secret), Query(String), Connect, More, Select(Id), OpenSelected, Publish, Save, Check, Reload, ReviewFile(String), ReviewAction(iced::widget::text_editor::Action), ReviewBack, Local, Forget, Completed(Id, Id, Result), } #[derive(Debug, Clone)] pub enum Outcome { Catalog(Catalog), Remote(Remote), } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Operation { Catalog(bool), Open(Id), Publish, Save, Check, } #[derive(Debug, Clone)] pub struct Session { pub connection: Connection, pub resource_id: Id, pub revision: u64, pub etag: String, } #[derive(Debug, Clone)] pub struct Request { pub id: Id, pub document: Id, pub revision: u64, pub operation: Operation, pub connection: Connection, pub resource_id: Option, pub etag: Option, pub snapshot: Arc, } #[derive(Debug, Clone)] pub struct Review { pub connection: Connection, pub remote: Remote, } pub struct State { pub visible: bool, pub base: String, pub token: Secret, pub query: String, pub catalog: Vec, pub catalog_stale: bool, pub next: Option, pub selected: Option, pub connection: Option, pub session: Option, pub request: Option, pub uncertain: Option, pub review: Option, pub review_path: Option, pub review_editor: iced::widget::text_editor::Content, pub error: Option, pub open_target: Option<(Connection, Id)>, } impl Default for State { fn default() -> Self { Self { visible: false, base: "http://127.0.0.1:8787".into(), token: Secret::default(), query: String::new(), catalog: vec![], catalog_stale: true, next: None, selected: None, connection: None, session: None, request: None, uncertain: None, review: None, review_path: None, review_editor: iced::widget::text_editor::Content::new(), error: None, open_target: None, } } } impl State { pub fn invalidate_catalog(&mut self) { self.catalog_stale = true; self.next = None; } pub fn catalog_message(&self) -> Option<&'static str> { if self.connection.is_none() { Some("Connect / refresh to load models for this service.") } else if self.catalog_stale { Some("Catalog may be out of date. Connect / refresh to update these results.") } else if self.catalog.is_empty() { Some("No models found. Publish the current model or change the search.") } else { None } } /// Keep explicit connection settings in memory, but never carry a resource /// binding or in-flight result into another local document. pub fn leave_document(&mut self) { self.visible = false; self.session = None; self.request = None; self.uncertain = None; self.review = None; self.review_path = None; self.review_editor = iced::widget::text_editor::Content::new(); self.error = None; self.open_target = None; } }