@ -4,8 +4,8 @@ use crate::connection;
use crate ::model ::cfd ::CannotRollover ;
use crate ::model ::cfd ::Cfd ;
use crate ::model ::cfd ::Dlc ;
use crate ::model ::cfd ::OrderId ;
use crate ::model ::cfd ::Role ;
use crate ::model ::cfd ::RolloverCompleted ;
use crate ::model ::cfd ::RolloverProposal ;
use crate ::model ::cfd ::SettlementKind ;
use crate ::model ::BitMexPriceEventId ;
@ -44,7 +44,7 @@ pub struct Actor {
maker : xtra ::Address < connection ::Actor > ,
get_announcement : Box < dyn MessageChannel < GetAnnouncement > > ,
projection : xtra ::Address < projection ::Actor > ,
on_completed : Box < dyn MessageChannel < Completed > > ,
on_completed : Box < dyn MessageChannel < Rollover Completed> > ,
on_stopping : Vec < Box < dyn MessageChannel < Stopping < Self > > > > ,
rollover_msg_sender : Option < UnboundedSender < RollOverMsg > > ,
tasks : Tasks ,
@ -57,7 +57,7 @@ impl Actor {
maker : xtra ::Address < connection ::Actor > ,
get_announcement : & ( impl MessageChannel < GetAnnouncement > + 'static ) ,
projection : xtra ::Address < projection ::Actor > ,
on_completed : & ( impl MessageChannel < Completed > + 'static ) ,
on_completed : & ( impl MessageChannel < Rollover Completed> + 'static ) ,
( on_stopping0 , on_stopping1 ) : (
& ( impl MessageChannel < Stopping < Self > > + 'static ) ,
& ( impl MessageChannel < Stopping < Self > > + 'static ) ,
@ -186,7 +186,7 @@ impl Actor {
Ok ( ( ) )
}
async fn complete ( & mut self , completed : Completed , ctx : & mut xtra ::Context < Self > ) {
async fn complete ( & mut self , completed : Rollover Completed, ctx : & mut xtra ::Context < Self > ) {
let _ = self . on_completed . send ( completed ) . await ;
ctx . stop ( ) ;
@ -198,9 +198,17 @@ impl xtra::Actor for Actor {
async fn started ( & mut self , ctx : & mut xtra ::Context < Self > ) {
if let Err ( e ) = self . cfd . can_roll_over ( OffsetDateTime ::now_utc ( ) ) {
self . complete (
Completed ::NoRollover {
order_id : self . cfd . id ( ) ,
reason : e ,
match e {
CannotRollover ::NoDlc = > RolloverCompleted ::Failed {
order_id : self . cfd . id ( ) ,
error : e . into ( ) ,
} ,
CannotRollover ::AlreadyExpired
| CannotRollover ::WasJustRolledOver
| CannotRollover ::WrongState { . . } = > RolloverCompleted ::Rejected {
order_id : self . cfd . id ( ) ,
reason : e . into ( ) ,
} ,
} ,
ctx ,
)
@ -213,7 +221,7 @@ impl xtra::Actor for Actor {
if let Err ( e ) = self . propose ( this ) . await {
self . complete (
Completed ::Failed {
Rollover Completed ::Failed {
order_id : self . cfd . id ( ) ,
error : e ,
} ,
@ -265,7 +273,7 @@ impl Actor {
) {
if let Err ( error ) = self . handle_confirmed ( msg , ctx ) . await {
self . complete (
Completed ::Failed {
Rollover Completed ::Failed {
order_id : self . cfd . id ( ) ,
error ,
} ,
@ -278,9 +286,9 @@ impl Actor {
pub async fn reject_rollover ( & mut self , _ : RollOverRejected , ctx : & mut xtra ::Context < Self > ) {
let order_id = self . cfd . id ( ) ;
let completed = if let Err ( error ) = self . handle_rejected ( ) . await {
Completed ::Failed { order_id , error }
Rollover Completed ::Failed { order_id , error }
} else {
Completed ::Rejected { order_id }
RolloverCompleted ::rejected ( order_id )
} ;
self . complete ( completed , ctx ) . await ;
@ -291,14 +299,8 @@ impl Actor {
msg : RolloverSucceeded ,
ctx : & mut xtra ::Context < Self > ,
) {
self . complete (
Completed ::UpdatedContract {
order_id : self . cfd . id ( ) ,
dlc : msg . dlc ,
} ,
ctx ,
)
. await ;
self . complete ( RolloverCompleted ::succeeded ( self . cfd . id ( ) , msg . dlc ) , ctx )
. await ;
}
pub async fn handle_rollover_failed (
@ -307,7 +309,7 @@ impl Actor {
ctx : & mut xtra ::Context < Self > ,
) {
self . complete (
Completed ::Failed {
Rollover Completed ::Failed {
order_id : self . cfd . id ( ) ,
error : msg . error ,
} ,
@ -323,7 +325,7 @@ impl Actor {
) {
if let Err ( error ) = self . forward_protocol_msg ( msg ) . await {
self . complete (
Completed ::Failed {
Rollover Completed ::Failed {
order_id : self . cfd . id ( ) ,
error ,
} ,
@ -358,29 +360,6 @@ pub struct RolloverFailed {
error : anyhow ::Error ,
}
#[ allow(clippy::large_enum_variant) ]
pub enum Completed {
UpdatedContract {
order_id : OrderId ,
dlc : Dlc ,
} ,
Rejected {
order_id : OrderId ,
} ,
Failed {
order_id : OrderId ,
error : anyhow ::Error ,
} ,
NoRollover {
order_id : OrderId ,
reason : CannotRollover ,
} ,
}
impl xtra ::Message for Completed {
type Result = Result < ( ) > ;
}
impl ActorName for Actor {
fn actor_name ( ) -> String {
"Taker rollover" . to_string ( )