move ItemStateAction to its own file
This commit is contained in:
parent
f5968582b1
commit
60802d3377
@ -8,8 +8,9 @@ use std::pin::Pin;
|
|||||||
use crate::ship::map::MapArea;
|
use crate::ship::map::MapArea;
|
||||||
use crate::entity::character::{CharacterEntity, CharacterEntityId};
|
use crate::entity::character::{CharacterEntity, CharacterEntityId};
|
||||||
use crate::entity::gateway::{EntityGateway, EntityGatewayTransaction};
|
use crate::entity::gateway::{EntityGateway, EntityGatewayTransaction};
|
||||||
use crate::ship::items::state::{ItemState, ItemStateProxy, ItemStateAction, ItemAction, ItemStateError, FloorItem, InventoryItem, AddItemResult, FloorItemDetail,
|
use crate::ship::items::state::{ItemState, ItemStateProxy, ItemStateError, FloorItem, InventoryItem, AddItemResult, FloorItemDetail,
|
||||||
StackedItemDetail, BankItem, BankItemDetail, InventoryItemDetail, IndividualItemDetail};
|
StackedItemDetail, BankItem, BankItemDetail, InventoryItemDetail, IndividualItemDetail};
|
||||||
|
use crate::ship::items::itemstateaction::{ItemStateAction, ItemAction};
|
||||||
use crate::ship::items::apply_item::apply_item;
|
use crate::ship::items::apply_item::apply_item;
|
||||||
use crate::entity::item::{ItemDetail, NewItemEntity, TradeId};
|
use crate::entity::item::{ItemDetail, NewItemEntity, TradeId};
|
||||||
use crate::entity::item::tool::Tool;
|
use crate::entity::item::tool::Tool;
|
||||||
|
137
src/ship/items/itemstateaction.rs
Normal file
137
src/ship/items/itemstateaction.rs
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
use std::future::Future;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
pub trait ItemAction {
|
||||||
|
type Input;
|
||||||
|
type Output;
|
||||||
|
type Start;
|
||||||
|
type Error;
|
||||||
|
|
||||||
|
async fn action(&self, s: Self::Start, i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error>;
|
||||||
|
async fn commit(&self, v: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub struct ItemStateAction<T, S, E> {
|
||||||
|
_t: std::marker::PhantomData<T>,
|
||||||
|
_s: std::marker::PhantomData<S>,
|
||||||
|
_e: std::marker::PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, S, E> Default for ItemStateAction<T, S, E> {
|
||||||
|
fn default() -> ItemStateAction<T, S, E> {
|
||||||
|
ItemStateAction {
|
||||||
|
_t: std::marker::PhantomData,
|
||||||
|
_s: std::marker::PhantomData,
|
||||||
|
_e: std::marker::PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, S, E> ItemStateAction<T, S, E>
|
||||||
|
where
|
||||||
|
T: Send + Sync,
|
||||||
|
S: Send + Sync,
|
||||||
|
E: Send + Sync,
|
||||||
|
{
|
||||||
|
pub fn act<O, F, Fut>(self, f: F) -> ItemActionStage<O, ItemStateAction<T, S, E>, F, Fut, S, E>
|
||||||
|
where
|
||||||
|
F: Fn(S, ()) -> Fut + Send + Sync,
|
||||||
|
Fut: Future<Output=Result<(S, O), E>> + Send
|
||||||
|
{
|
||||||
|
ItemActionStage {
|
||||||
|
_s: Default::default(),
|
||||||
|
_e: std::marker::PhantomData,
|
||||||
|
prev: self,
|
||||||
|
actionf: f,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ItemActionStage<O, P, F, Fut, S, E>
|
||||||
|
where
|
||||||
|
P: ItemAction,
|
||||||
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
||||||
|
Fut: Future<Output=Result<(S, O) , E>> + Send,
|
||||||
|
{
|
||||||
|
_s: std::marker::PhantomData<S>,
|
||||||
|
_e: std::marker::PhantomData<E>,
|
||||||
|
prev: P,
|
||||||
|
actionf: F,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl<O, P: ItemAction, F, Fut, S, E> ItemAction for ItemActionStage<O, P, F, Fut, S, E>
|
||||||
|
where
|
||||||
|
P: ItemAction + ItemAction<Start = S, Error = E> + Send + Sync,
|
||||||
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
||||||
|
Fut: Future<Output=Result<(S, O), E>> + Send,
|
||||||
|
S: Send + Sync,
|
||||||
|
P::Output: Send + Sync,
|
||||||
|
E: Send + Sync,
|
||||||
|
O: Send + Sync,
|
||||||
|
P::Error: Send + Sync,
|
||||||
|
{
|
||||||
|
type Input = P::Output;
|
||||||
|
type Output = O;
|
||||||
|
type Start = S;
|
||||||
|
type Error = P::Error;
|
||||||
|
|
||||||
|
async fn action(&self, s: Self::Start, i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error> {
|
||||||
|
(self.actionf)(s, i).await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn commit(&self, i: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error> {
|
||||||
|
let (i, prev) = self.prev.commit(i).await?;
|
||||||
|
self.action(i, prev).await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<O, P: ItemAction, F, Fut, S, E> ItemActionStage<O, P, F, Fut, S, E>
|
||||||
|
where
|
||||||
|
P: ItemAction<Start = S, Error = E> + Send + Sync,
|
||||||
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
||||||
|
Fut: Future<Output=Result<(S, O), E>> + Send,
|
||||||
|
S: Send + Sync,
|
||||||
|
P::Output: Send + Sync,
|
||||||
|
E: Send + Sync,
|
||||||
|
O: Send + Sync,
|
||||||
|
P::Error: Send + Sync,
|
||||||
|
{
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
|
pub fn act<O2, G, GFut>(self, g: G) -> ItemActionStage<O2, ItemActionStage<O, P, F, Fut, S, E>, G, GFut, S, E>
|
||||||
|
where
|
||||||
|
S: Send + Sync,
|
||||||
|
G: Fn(S, <ItemActionStage<O, P, F, Fut, S, E> as ItemAction>::Output) -> GFut + Send + Sync,
|
||||||
|
GFut: Future<Output=Result<(S, O2), E>> + Send,
|
||||||
|
O2: Send + Sync,
|
||||||
|
{
|
||||||
|
ItemActionStage {
|
||||||
|
_s: Default::default(),
|
||||||
|
_e: Default::default(),
|
||||||
|
prev: self,
|
||||||
|
actionf: g,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl<T, S, E> ItemAction for ItemStateAction<T, S, E>
|
||||||
|
where
|
||||||
|
T: Send + Sync,
|
||||||
|
S: Send + Sync,
|
||||||
|
E: Send + Sync,
|
||||||
|
{
|
||||||
|
type Input = T;
|
||||||
|
type Output = ();
|
||||||
|
type Start = T;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
async fn action(&self, s: Self::Start, _i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error> {
|
||||||
|
Ok((s, ()))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn commit(&self, i: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error> {
|
||||||
|
Ok((i, ()))
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,7 @@
|
|||||||
pub mod state;
|
pub mod state;
|
||||||
pub mod actions;
|
pub mod actions;
|
||||||
pub mod apply_item;
|
pub mod apply_item;
|
||||||
use serde::{Serialize, Deserialize};
|
pub mod itemstateaction;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, derive_more::Display)]
|
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, serde::Serialize, serde::Deserialize, derive_more::Display)]
|
||||||
pub struct ClientItemId(pub u32);
|
pub struct ClientItemId(pub u32);
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,141 +84,6 @@ pub enum FloorType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
|
||||||
pub trait ItemAction {
|
|
||||||
type Input;
|
|
||||||
type Output;
|
|
||||||
type Start;
|
|
||||||
type Error;
|
|
||||||
|
|
||||||
async fn action(&self, s: Self::Start, i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error>;
|
|
||||||
async fn commit(&self, v: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error>;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
pub struct ItemStateAction<T, S, E> {
|
|
||||||
_t: std::marker::PhantomData<T>,
|
|
||||||
_s: std::marker::PhantomData<S>,
|
|
||||||
_e: std::marker::PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, S, E> Default for ItemStateAction<T, S, E> {
|
|
||||||
fn default() -> ItemStateAction<T, S, E> {
|
|
||||||
ItemStateAction {
|
|
||||||
_t: std::marker::PhantomData,
|
|
||||||
_s: std::marker::PhantomData,
|
|
||||||
_e: std::marker::PhantomData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, S, E> ItemStateAction<T, S, E>
|
|
||||||
where
|
|
||||||
T: Send + Sync,
|
|
||||||
S: Send + Sync,
|
|
||||||
E: Send + Sync,
|
|
||||||
{
|
|
||||||
pub fn act<O, F, Fut>(self, f: F) -> ItemActionStage<O, ItemStateAction<T, S, E>, F, Fut, S, E>
|
|
||||||
where
|
|
||||||
F: Fn(S, ()) -> Fut + Send + Sync,
|
|
||||||
Fut: Future<Output=Result<(S, O), E>> + Send
|
|
||||||
{
|
|
||||||
ItemActionStage {
|
|
||||||
_s: Default::default(),
|
|
||||||
_e: std::marker::PhantomData,
|
|
||||||
prev: self,
|
|
||||||
actionf: f,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ItemActionStage<O, P, F, Fut, S, E>
|
|
||||||
where
|
|
||||||
P: ItemAction,
|
|
||||||
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
||||||
Fut: Future<Output=Result<(S, O) , E>> + Send,
|
|
||||||
{
|
|
||||||
_s: std::marker::PhantomData<S>,
|
|
||||||
_e: std::marker::PhantomData<E>,
|
|
||||||
prev: P,
|
|
||||||
actionf: F,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
|
||||||
impl<O, P: ItemAction, F, Fut, S, E> ItemAction for ItemActionStage<O, P, F, Fut, S, E>
|
|
||||||
where
|
|
||||||
P: ItemAction + ItemAction<Start = S, Error = E> + Send + Sync,
|
|
||||||
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
||||||
Fut: Future<Output=Result<(S, O), E>> + Send,
|
|
||||||
S: Send + Sync,
|
|
||||||
P::Output: Send + Sync,
|
|
||||||
E: Send + Sync,
|
|
||||||
O: Send + Sync,
|
|
||||||
P::Error: Send + Sync,
|
|
||||||
{
|
|
||||||
type Input = P::Output;
|
|
||||||
type Output = O;
|
|
||||||
type Start = S;
|
|
||||||
type Error = P::Error;
|
|
||||||
|
|
||||||
async fn action(&self, s: Self::Start, i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error> {
|
|
||||||
(self.actionf)(s, i).await
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn commit(&self, i: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error> {
|
|
||||||
let (i, prev) = self.prev.commit(i).await?;
|
|
||||||
self.action(i, prev).await
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<O, P: ItemAction, F, Fut, S, E> ItemActionStage<O, P, F, Fut, S, E>
|
|
||||||
where
|
|
||||||
P: ItemAction<Start = S, Error = E> + Send + Sync,
|
|
||||||
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
||||||
Fut: Future<Output=Result<(S, O), E>> + Send,
|
|
||||||
S: Send + Sync,
|
|
||||||
P::Output: Send + Sync,
|
|
||||||
E: Send + Sync,
|
|
||||||
O: Send + Sync,
|
|
||||||
P::Error: Send + Sync,
|
|
||||||
{
|
|
||||||
#[allow(clippy::type_complexity)]
|
|
||||||
pub fn act<O2, G, GFut>(self, g: G) -> ItemActionStage<O2, ItemActionStage<O, P, F, Fut, S, E>, G, GFut, S, E>
|
|
||||||
where
|
|
||||||
S: Send + Sync,
|
|
||||||
G: Fn(S, <ItemActionStage<O, P, F, Fut, S, E> as ItemAction>::Output) -> GFut + Send + Sync,
|
|
||||||
GFut: Future<Output=Result<(S, O2), E>> + Send,
|
|
||||||
O2: Send + Sync,
|
|
||||||
{
|
|
||||||
ItemActionStage {
|
|
||||||
_s: Default::default(),
|
|
||||||
_e: Default::default(),
|
|
||||||
prev: self,
|
|
||||||
actionf: g,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
|
||||||
impl<T, S, E> ItemAction for ItemStateAction<T, S, E>
|
|
||||||
where
|
|
||||||
T: Send + Sync,
|
|
||||||
S: Send + Sync,
|
|
||||||
E: Send + Sync,
|
|
||||||
{
|
|
||||||
type Input = T;
|
|
||||||
type Output = ();
|
|
||||||
type Start = T;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
async fn action(&self, s: Self::Start, _i: Self::Input) -> Result<(Self::Start, Self::Output), Self::Error> {
|
|
||||||
Ok((s, ()))
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn commit(&self, i: Self::Start) -> Result<(Self::Start, Self::Output), Self::Error> {
|
|
||||||
Ok((i, ()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user