bffh/src/api/machine.rs

138 lines
3.3 KiB
Rust
Raw Normal View History

2020-11-20 13:06:55 +01:00
use std::sync::Arc;
use std::ops::Deref;
2020-11-17 14:15:29 +01:00
use capnp::capability::Promise;
use capnp::Error;
use futures::FutureExt;
2021-09-09 21:50:11 +02:00
use crate::schema::machine_capnp::machine::*;
2020-11-20 13:06:55 +01:00
use crate::connection::Session;
use crate::db::Databases;
2021-01-20 11:55:15 +00:00
use crate::db::machine::{Status, MachineState};
2021-02-09 17:41:05 +00:00
use crate::machine::{Machine as NwMachine, ReturnToken};
2020-11-17 14:15:29 +01:00
2020-11-20 13:06:55 +01:00
#[derive(Clone)]
pub struct Machine {
session: Arc<Session>,
2020-12-16 11:32:31 +01:00
machine: NwMachine,
2020-11-20 13:06:55 +01:00
db: Databases,
}
2020-11-17 14:15:29 +01:00
2020-11-17 14:28:04 +01:00
impl Machine {
2020-12-16 11:32:31 +01:00
pub fn new(session: Arc<Session>, machine: NwMachine, db: Databases) -> Self {
Machine { session, machine, db }
2020-11-17 14:28:04 +01:00
}
2020-11-20 15:43:03 +01:00
pub fn fill(self: Arc<Self>, builder: &mut Builder) {
builder.set_manage(capnp_rpc::new_client(Manage(self.clone())));
builder.set_admin(capnp_rpc::new_client(Admin(self.clone())));
2020-11-20 15:43:03 +01:00
}
2020-11-17 14:28:04 +01:00
}
#[derive(Clone)]
pub struct Read(Arc<Machine>);
impl Read {
pub fn new(inner: Arc<Machine>) -> Self {
Self(inner)
}
}
2020-11-17 14:28:04 +01:00
2021-09-09 21:50:11 +02:00
impl info::Server for Read {
2020-11-17 14:15:29 +01:00
}
2020-11-20 13:06:55 +01:00
struct Write(Arc<Machine>);
2020-11-17 14:28:04 +01:00
2021-09-09 21:50:11 +02:00
impl use_::Server for Write {
2020-11-17 14:15:29 +01:00
fn use_(&mut self,
2021-09-09 21:50:11 +02:00
_params: use_::UseParams,
mut results: use_::UseResults)
2021-01-20 11:55:15 +00:00
-> Promise<(), Error>
{
2021-02-09 17:15:31 +00:00
let uid = self.0.session.user.try_lock().unwrap().as_ref().map(|u| u.id.clone());
2021-01-20 11:55:15 +00:00
let new_state = MachineState::used(uid.clone());
let this = self.0.clone();
2021-02-09 17:41:05 +00:00
let f = async move {
let res_token = this.machine.request_state_change(
this.session.user.try_lock().unwrap().as_ref(),
new_state
).await;
match res_token {
// TODO: Do something with the token we get returned
2021-02-09 17:41:05 +00:00
Ok(tok) => {
return Ok(());
},
2021-02-09 08:51:53 +00:00
Err(e) => Err(capnp::Error::failed(format!("State change request returned {}", e))),
2021-02-09 17:41:05 +00:00
}
};
Promise::from_future(f)
2021-01-20 11:55:15 +00:00
}
fn reserve(&mut self,
2021-09-09 21:50:11 +02:00
_params: use_::ReserveParams,
_results: use_::ReserveResults)
2020-11-17 14:15:29 +01:00
-> Promise<(), Error>
{
unimplemented!()
}
2021-09-09 21:50:11 +02:00
}
impl in_use::Server for Write {
fn give_back(&mut self,
_params: in_use::GiveBackParams,
mut results: in_use::GiveBackResults)
-> Promise<(), Error>
{
let this = self.0.clone();
let f = async move {
let status = this.machine.get_status().await;
let sess = this.session.clone();
match status {
Status::InUse(Some(uid)) => {
let user = sess.user.lock().await;
if let Some(u) = user.as_ref() {
if u.id == uid {
}
}
},
// Machine not in use
_ => {
}
}
};
Promise::from_future(f.map(|_| Ok(())))
}
2020-11-17 14:15:29 +01:00
}
2020-11-20 13:06:55 +01:00
struct Manage(Arc<Machine>);
2020-11-17 14:28:04 +01:00
impl manage::Server for Manage {
2020-11-17 14:15:29 +01:00
}
2020-11-20 13:06:55 +01:00
struct Admin(Arc<Machine>);
2020-11-17 14:28:04 +01:00
impl admin::Server for Admin {
2020-11-17 14:15:29 +01:00
fn force_set_state(&mut self,
_params: admin::ForceSetStateParams,
_results: admin::ForceSetStateResults)
-> Promise<(), Error>
{
unimplemented!()
}
fn force_set_user(&mut self,
_params: admin::ForceSetUserParams,
_results: admin::ForceSetUserResults)
-> Promise<(), Error>
{
unimplemented!()
}
}