embedded master: rename
This commit is contained in:
parent
60107a2b6f
commit
0d8de9092b
2 changed files with 54 additions and 8 deletions
|
@ -27,7 +27,7 @@ use tokio::sync::oneshot::channel;
|
||||||
|
|
||||||
use super::counter::Counter;
|
use super::counter::Counter;
|
||||||
use crate::errors::*;
|
use crate::errors::*;
|
||||||
use crate::master::messages::{AddSite, AddVisitor};
|
use crate::master::messages::{AddSite, AddVisitor, Rename};
|
||||||
use crate::master::Master as MasterTrait;
|
use crate::master::Master as MasterTrait;
|
||||||
|
|
||||||
/// This Actor manages the [Counter] actors.
|
/// This Actor manages the [Counter] actors.
|
||||||
|
@ -71,6 +71,15 @@ impl Master {
|
||||||
pub fn rm_site(&mut self, id: &str) {
|
pub fn rm_site(&mut self, id: &str) {
|
||||||
self.sites.remove(id);
|
self.sites.remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// renames [Counter] actor
|
||||||
|
pub fn rename(&mut self, msg: Rename) {
|
||||||
|
// If actor isn't present, it's okay to not throw an error
|
||||||
|
// since actors are lazyily initialized and are cleaned up when inactive
|
||||||
|
if let Some((_, counter)) = self.sites.remove(&msg.name) {
|
||||||
|
self.add_site(counter, msg.rename_to);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Actor for Master {
|
impl Actor for Master {
|
||||||
|
@ -115,6 +124,21 @@ impl Handler<AddVisitor> for Master {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Handler<Rename> for Master {
|
||||||
|
type Result = MessageResult<Rename>;
|
||||||
|
|
||||||
|
fn handle(&mut self, m: Rename, ctx: &mut Self::Context) -> Self::Result {
|
||||||
|
self.rename(m);
|
||||||
|
let (tx, rx) = channel();
|
||||||
|
let fut = async move {
|
||||||
|
let _ = tx.send(Ok(()));
|
||||||
|
}
|
||||||
|
.into_actor(self);
|
||||||
|
ctx.spawn(fut);
|
||||||
|
MessageResult(rx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Message to get an [Counter] actor from master
|
/// Message to get an [Counter] actor from master
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
#[rtype(result = "Option<Addr<Counter>>")]
|
#[rtype(result = "Option<Addr<Counter>>")]
|
||||||
|
@ -198,24 +222,39 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::master::embedded::counter::tests::*;
|
use crate::master::embedded::counter::tests::*;
|
||||||
use crate::master::messages::AddSiteBuilder;
|
use crate::master::messages::AddSiteBuilder;
|
||||||
|
use crate::master::messages::RenameBuilder;
|
||||||
|
use crate::MCaptcha;
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn master_actor_works() {
|
async fn master_actor_works() {
|
||||||
let addr = Master::new(1).start();
|
let addr = Master::new(1).start();
|
||||||
|
|
||||||
|
let get_add_site_msg = |id: String, mcaptcha: MCaptcha| {
|
||||||
|
AddSiteBuilder::default()
|
||||||
|
.id(id)
|
||||||
|
.mcaptcha(mcaptcha)
|
||||||
|
.build()
|
||||||
|
.unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
let id = "yo";
|
let id = "yo";
|
||||||
let mcaptcha = get_mcaptcha();
|
let msg = get_add_site_msg(id.into(), get_mcaptcha());
|
||||||
let msg = AddSiteBuilder::default()
|
|
||||||
.id(id.into())
|
|
||||||
.mcaptcha(mcaptcha.clone())
|
|
||||||
.build()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
addr.send(msg).await.unwrap();
|
addr.send(msg).await.unwrap();
|
||||||
|
|
||||||
let mcaptcha_addr = addr.send(GetSite(id.into())).await.unwrap();
|
let mcaptcha_addr = addr.send(GetSite(id.into())).await.unwrap();
|
||||||
assert!(mcaptcha_addr.is_some());
|
assert!(mcaptcha_addr.is_some());
|
||||||
|
|
||||||
|
let new_id = "yoyo";
|
||||||
|
let rename = RenameBuilder::default()
|
||||||
|
.name(id.into())
|
||||||
|
.rename_to(new_id.into())
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
addr.send(rename).await.unwrap();
|
||||||
|
let mcaptcha_addr = addr.send(GetSite(new_id.into())).await.unwrap();
|
||||||
|
assert!(mcaptcha_addr.is_some());
|
||||||
|
|
||||||
let addr_doesnt_exist = addr.send(GetSite("a".into())).await.unwrap();
|
let addr_doesnt_exist = addr.send(GetSite("a".into())).await.unwrap();
|
||||||
assert!(addr_doesnt_exist.is_none());
|
assert!(addr_doesnt_exist.is_none());
|
||||||
|
|
||||||
|
@ -225,7 +264,7 @@ mod tests {
|
||||||
// delay_for(timer_expire).await;
|
// delay_for(timer_expire).await;
|
||||||
// delay_for(timer_expire).await;
|
// delay_for(timer_expire).await;
|
||||||
|
|
||||||
let mcaptcha_addr = addr.send(GetSite(id.into())).await.unwrap();
|
let mcaptcha_addr = addr.send(GetSite(new_id.into())).await.unwrap();
|
||||||
assert_eq!(mcaptcha_addr, None);
|
assert_eq!(mcaptcha_addr, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,4 +83,11 @@ pub mod messages {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
pub mcaptcha: MCaptcha,
|
pub mcaptcha: MCaptcha,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Message, Builder)]
|
||||||
|
#[rtype(result = "Receiver<CaptchaResult<()>>")]
|
||||||
|
pub struct Rename {
|
||||||
|
pub name: String,
|
||||||
|
pub rename_to: String,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue