@@ -12,14 +12,21 @@ lazy_static! {
12
12
#[ no_mangle]
13
13
pub fn wss_serve (
14
14
args : Vec < Edn > ,
15
- handler : Arc < dyn Fn ( Edn ) -> Result < Edn , String > + Send + Sync + ' static > ,
15
+ handler : Arc < dyn Fn ( Vec < Edn > ) -> Result < Edn , String > + Send + Sync + ' static > ,
16
16
) -> Result < Edn , String > {
17
- println ! ( "args: {:?}" , args) ;
18
- // let result = handler(Edn::Str(msg.into_text().unwrap().to_string()));
17
+ let port = match args. get ( 0 ) {
18
+ Some ( Edn :: Map ( m) ) => match m. get ( & Edn :: Keyword ( String :: from ( "port" ) ) ) {
19
+ Some ( Edn :: Number ( n) ) => n. floor ( ) . round ( ) as u16 ,
20
+ Some ( a) => return Err ( format ! ( "Unknown port: {}" , a) ) ,
21
+ None => 9001 ,
22
+ } ,
23
+ Some ( Edn :: Nil ) => 9001 ,
24
+ Some ( a) => return Err ( format ! ( "Unknown option: {}" , a) ) ,
25
+ None => 9001 ,
26
+ } ;
19
27
20
- // listen for WebSockets on port 9001:
21
- let event_hub = simple_websockets:: launch ( 9001 ) . expect ( "failed to listen on port 9001" ) ;
22
- // map between client ids and the client's `Responder`:
28
+ // listen for WebSockets on port, defaults to 9001:
29
+ let event_hub = simple_websockets:: launch ( port) . expect ( "failed to listen on port 9001" ) ;
23
30
24
31
spawn ( move || {
25
32
loop {
@@ -35,10 +42,10 @@ pub fn wss_serve(
35
42
let mut clients = CLIENTS . write ( ) . unwrap ( ) ;
36
43
clients. insert ( client_id, responder) ;
37
44
}
38
- if let Err ( e) = handler ( Edn :: List ( vec ! [
45
+ if let Err ( e) = handler ( vec ! [ Edn :: List ( vec![
39
46
Edn :: Keyword ( String :: from( "connect" ) ) ,
40
47
Edn :: Number ( client_id as f64 ) ,
41
- ] ) ) {
48
+ ] ) ] ) {
42
49
println ! ( "Failed to handle connect: {}" , e)
43
50
}
44
51
}
@@ -48,29 +55,29 @@ pub fn wss_serve(
48
55
let mut clients = CLIENTS . write ( ) . unwrap ( ) ;
49
56
clients. remove ( & client_id) ;
50
57
}
51
- if let Err ( e) = handler ( Edn :: List ( vec ! [
58
+ if let Err ( e) = handler ( vec ! [ Edn :: List ( vec![
52
59
Edn :: Keyword ( String :: from( "disconnect" ) ) ,
53
60
Edn :: Number ( client_id as f64 ) ,
54
- ] ) ) {
61
+ ] ) ] ) {
55
62
println ! ( "Failed to handle disconnect: {}" , e)
56
63
}
57
64
}
58
65
Event :: Message ( client_id, message) => match message {
59
66
Message :: Text ( s) => {
60
- if let Err ( e) = handler ( Edn :: List ( vec ! [
67
+ if let Err ( e) = handler ( vec ! [ Edn :: List ( vec![
61
68
Edn :: Keyword ( String :: from( "message" ) ) ,
62
69
Edn :: Number ( client_id as f64 ) ,
63
70
Edn :: Str ( s) ,
64
- ] ) ) {
71
+ ] ) ] ) {
65
72
println ! ( "Failed to handle text message: {}" , e)
66
73
}
67
74
}
68
75
Message :: Binary ( buf) => {
69
- if let Err ( e) = handler ( Edn :: List ( vec ! [
76
+ if let Err ( e) = handler ( vec ! [ Edn :: List ( vec![
70
77
Edn :: Keyword ( String :: from( "message" ) ) ,
71
78
Edn :: Number ( client_id as f64 ) ,
72
79
Edn :: Buffer ( buf) ,
73
- ] ) ) {
80
+ ] ) ] ) {
74
81
println ! ( "Failed to handle binary message: {}" , e)
75
82
}
76
83
}
@@ -104,7 +111,7 @@ pub fn wss_send(args: Vec<Edn>) -> Result<Edn, String> {
104
111
#[ no_mangle]
105
112
pub fn wss_each (
106
113
_args : Vec < Edn > ,
107
- handler : Arc < dyn Fn ( Edn ) -> Result < Edn , String > + Send + Sync + ' static > ,
114
+ handler : Arc < dyn Fn ( Vec < Edn > ) -> Result < Edn , String > + Send + Sync + ' static > ,
108
115
) -> Result < Edn , String > {
109
116
let mut ids: Vec < u64 > = vec ! [ ] ;
110
117
{
@@ -117,7 +124,7 @@ pub fn wss_each(
117
124
}
118
125
119
126
for id in ids {
120
- handler ( Edn :: Number ( id as f64 ) ) ?;
127
+ handler ( vec ! [ Edn :: Number ( id as f64 ) ] ) ?;
121
128
}
122
129
123
130
Ok ( Edn :: Nil )
0 commit comments