@@ -594,12 +594,12 @@ mod simple_with_option {
594
594
mod multiple_paths {
595
595
wit_bindgen_wrpc:: generate!( {
596
596
inline: r#"
597
- package test:paths;
597
+ package test:paths;
598
598
599
- world test {
600
- import paths:path1/test;
601
- export paths:path2/test;
602
- }
599
+ world test {
600
+ import paths:path1/test;
601
+ export paths:path2/test;
602
+ }
603
603
"# ,
604
604
path: [ "tests/wit/path1" , "tests/wit/path2" ] ,
605
605
generate_all,
@@ -610,20 +610,20 @@ mod multiple_paths {
610
610
mod interface_export_example {
611
611
wit_bindgen_wrpc:: generate!( {
612
612
inline: r#"
613
- package my:test;
613
+ package my:test;
614
614
615
- interface a {
616
- type my-type = u32;
617
- }
615
+ interface a {
616
+ type my-type = u32;
617
+ }
618
618
619
- world my-world {
620
- export b: interface {
621
- use a.{my-type};
619
+ world my-world {
620
+ export b: interface {
621
+ use a.{my-type};
622
622
623
- foo: func() -> my-type;
624
- }
625
- }
626
- "# ,
623
+ foo: func() -> my-type;
624
+ }
625
+ }
626
+ "# ,
627
627
} ) ;
628
628
629
629
#[ derive( Clone ) ]
@@ -648,41 +648,45 @@ mod interface_export_example {
648
648
} )
649
649
}
650
650
}
651
-
652
651
#[ allow( unused) ]
653
652
mod resource_example {
654
- use std:: sync:: RwLock ;
653
+ use std:: sync:: { Arc , RwLock } ;
654
+
655
+ use anyhow:: Context as _;
656
+ use bytes:: Bytes ;
657
+ use wrpc_transport:: { ResourceBorrow , ResourceOwn } ;
655
658
656
659
wit_bindgen_wrpc:: generate!( {
657
- inline: r#"
658
- package my:test;
659
-
660
- interface logging {
661
- enum level {
662
- debug,
663
- info,
664
- error,
665
- }
666
-
667
- resource logger {
668
- constructor(level: level);
669
- log: func(level: level, msg: string);
670
- level: func() -> level;
671
- set-level: func(level: level);
672
- }
673
- }
674
-
675
- world my-world {
676
- export logging;
677
- }
678
- "# ,
660
+ inline: r#"
661
+ package my:test;
662
+
663
+ interface logging {
664
+ enum level {
665
+ debug,
666
+ info,
667
+ error,
668
+ }
669
+
670
+ resource logger {
671
+ constructor(level: level);
672
+ log: func(level: level, msg: string);
673
+ level: func() -> level;
674
+ set-level: func(level: level);
675
+ }
676
+ }
677
+
678
+ world my-world {
679
+ export logging;
680
+ }
681
+ "# ,
679
682
} ) ;
680
683
681
684
use exports:: my:: test:: logging:: { Handler , HandlerLogger , Level , Logger } ;
682
- use wrpc_transport:: { ResourceBorrow , ResourceOwn } ;
683
685
684
- #[ derive( Clone ) ]
685
- struct MyComponent ;
686
+ #[ derive( Clone , Default ) ]
687
+ struct MyComponent {
688
+ loggers : Arc < RwLock < Vec < MyLogger > > > ,
689
+ }
686
690
687
691
// Note that the `logging` interface has no methods of its own but a trait
688
692
// is required to be implemented here to specify the type of `Logger`.
@@ -695,55 +699,65 @@ mod resource_example {
695
699
696
700
impl < Ctx : Send > HandlerLogger < Ctx > for MyComponent {
697
701
async fn new ( & self , cx : Ctx , level : Level ) -> anyhow:: Result < ResourceOwn < Logger > > {
698
- todo ! ( ) ;
699
-
700
- // Ok(MyLogger {
701
- // level: RwLock::new(level),
702
- // contents: RwLock::new(String::new()),
703
- // })
702
+ let mut loggers = self . loggers . write ( ) . unwrap ( ) ;
703
+ let handle = loggers. len ( ) . to_le_bytes ( ) ;
704
+ loggers. push ( MyLogger {
705
+ level : RwLock :: new ( level) ,
706
+ contents : RwLock :: new ( String :: new ( ) ) ,
707
+ } ) ;
708
+ Ok ( ResourceOwn :: from ( Bytes :: copy_from_slice ( & handle) ) )
704
709
}
705
710
706
711
async fn log (
707
712
& self ,
708
713
cx : Ctx ,
709
- self_ : ResourceBorrow < Logger > ,
714
+ logger : ResourceBorrow < Logger > ,
710
715
level : Level ,
711
716
msg : String ,
712
717
) -> anyhow:: Result < ( ) > {
713
- todo ! ( ) ;
714
-
715
- // if level as u32 <= *self.level.read().unwrap() as u32 {
716
- // self.contents.write().unwrap().push_str(&msg);
717
- // self.contents.write().unwrap().push('\n');
718
- // }
719
- // Ok(())
718
+ let i = Bytes :: from ( logger) . as_ref ( ) . try_into ( ) ?;
719
+ let i = usize:: from_le_bytes ( i) ;
720
+ let loggers = self . loggers . read ( ) . unwrap ( ) ;
721
+ let logger = loggers. get ( i) . context ( "invalid resource handle" ) ?;
722
+ if level as u32 <= * logger. level . read ( ) . unwrap ( ) as u32 {
723
+ let mut contents = logger. contents . write ( ) . unwrap ( ) ;
724
+ contents. push_str ( & msg) ;
725
+ contents. push_str ( "\n " ) ;
726
+ }
727
+ Ok ( ( ) )
720
728
}
721
729
722
- async fn level ( & self , cx : Ctx , self_ : ResourceBorrow < Logger > ) -> anyhow:: Result < Level > {
723
- todo ! ( ) ;
724
- // Ok(*self.level.read().unwrap())
730
+ async fn level ( & self , cx : Ctx , logger : ResourceBorrow < Logger > ) -> anyhow:: Result < Level > {
731
+ let i = Bytes :: from ( logger) . as_ref ( ) . try_into ( ) ?;
732
+ let i = usize:: from_le_bytes ( i) ;
733
+ let loggers = self . loggers . read ( ) . unwrap ( ) ;
734
+ let logger = loggers. get ( i) . context ( "invalid resource handle" ) ?;
735
+ let level = logger. level . read ( ) . unwrap ( ) ;
736
+ Ok ( level. clone ( ) )
725
737
}
726
738
727
739
async fn set_level (
728
740
& self ,
729
741
cx : Ctx ,
730
- self_ : ResourceBorrow < Logger > ,
742
+ logger : ResourceBorrow < Logger > ,
731
743
level : Level ,
732
744
) -> anyhow:: Result < ( ) > {
733
- todo ! ( ) ;
734
-
735
- // *self.level.write().unwrap() = level;
736
- // Ok(())
745
+ let i = Bytes :: from ( logger) . as_ref ( ) . try_into ( ) ?;
746
+ let i = usize:: from_le_bytes ( i) ;
747
+ let loggers = self . loggers . read ( ) . unwrap ( ) ;
748
+ let logger = loggers. get ( i) . context ( "invalid resource handle" ) ?;
749
+ * logger. level . write ( ) . unwrap ( ) = level;
750
+ Ok ( ( ) )
737
751
}
738
752
}
739
753
740
754
async fn serve_exports ( wrpc : & impl wrpc_transport:: Serve ) {
741
- use wit_bindgen_wrpc :: futures:: stream:: TryStreamExt as _;
755
+ use futures:: stream:: TryStreamExt as _;
742
756
743
- let invocations = serve ( wrpc, MyComponent ) . await . unwrap ( ) ;
757
+ let invocations = serve ( wrpc, MyComponent :: default ( ) ) . await . unwrap ( ) ;
744
758
let invocations = std:: thread:: spawn ( || invocations) . join ( ) . unwrap ( ) ;
745
759
invocations. into_iter ( ) . for_each ( |( instance, name, st) | {
746
- wit_bindgen_wrpc :: tokio:: spawn ( async move {
760
+ tokio:: spawn ( async move {
747
761
eprintln ! ( "serving {instance} {name}" ) ;
748
762
st. try_collect :: < Vec < _ > > ( ) . await . unwrap ( ) ;
749
763
} ) ;
@@ -755,67 +769,98 @@ mod resource_example {
755
769
mod example_4 {
756
770
wit_bindgen_wrpc:: generate!( {
757
771
inline: r#"
758
- package example:exported-resources;
759
-
760
- world import-some-resources {
761
- export logging;
762
- }
772
+ package example:exported-resources;
763
773
764
- interface logging {
765
- enum level {
766
- debug,
767
- info,
768
- warn,
769
- error,
774
+ world import-some-resources {
775
+ export logging;
770
776
}
771
- resource logger {
772
- constructor(max-level: level);
773
777
774
- get-max-level: func() -> level;
775
- set-max-level: func(level: level);
778
+ interface logging {
779
+ enum level {
780
+ debug,
781
+ info,
782
+ warn,
783
+ error,
784
+ }
785
+ resource logger {
786
+ constructor(max-level: level);
787
+
788
+ get-max-level: func() -> level;
789
+ set-max-level: func(level: level);
776
790
777
- log: func(level: level, msg: string);
791
+ log: func(level: level, msg: string);
792
+ }
778
793
}
779
- }
780
- "# ,
794
+ "# ,
781
795
} ) ;
782
796
}
783
797
784
798
#[ allow( unused) ]
785
799
mod async_test {
786
800
wit_bindgen_wrpc:: generate!( {
787
801
inline: r#"
788
- package wrpc-test:async;
802
+ package wrpc-test:async;
789
803
790
- world async {
791
- import handler;
792
- export handler;
793
- }
804
+ world async {
805
+ import handler;
806
+ export handler;
807
+ }
794
808
795
- interface handler {
796
- use types.{request, response};
809
+ interface handler {
810
+ use types.{request, response};
797
811
798
- handle: func(request: request) -> result<response, string>;
799
- }
812
+ handle: func(request: request) -> result<response, string>;
813
+ }
800
814
801
- interface types {
802
- type fields = list<tuple<string, list<list<u8>>>>;
815
+ interface types {
816
+ type fields = list<tuple<string, list<list<u8>>>>;
803
817
804
- record request {
805
- body: stream<u8>,
806
- trailers: future<option<fields>>,
807
- path-with-query: option<string>,
808
- authority: option<string>,
809
- headers: fields,
818
+ record request {
819
+ body: stream<u8>,
820
+ trailers: future<option<fields>>,
821
+ path-with-query: option<string>,
822
+ authority: option<string>,
823
+ headers: fields,
824
+ }
825
+
826
+ record response {
827
+ body: stream<u8>,
828
+ trailers: future<option<fields>>,
829
+ status: u16,
830
+ headers: fields,
831
+ }
810
832
}
833
+ "# ,
834
+ } ) ;
835
+ }
836
+
837
+ #[ allow( unused) ]
838
+ mod top_level_example {
839
+ wit_bindgen_wrpc:: generate!( {
840
+ inline: r"
841
+ package a:b;
842
+
843
+ world the-world {
844
+ record fahrenheit {
845
+ degrees: f32,
846
+ }
847
+
848
+ import what-temperature-is-it: func() -> fahrenheit;
811
849
812
- record response {
813
- body: stream<u8> ,
814
- trailers: future<option<fields>>,
815
- status: u16,
816
- headers: fields,
850
+ record celsius {
851
+ degrees: f32 ,
852
+ }
853
+
854
+ import convert-to-celsius: func(a: fahrenheit) -> celsius;
817
855
}
818
- }
819
- "# ,
856
+ " ,
820
857
} ) ;
858
+
859
+ async fn test ( wrpc : & impl wrpc_transport:: Invoke < Context = ( ) > ) -> anyhow:: Result < ( ) > {
860
+ let current_temp = what_temperature_is_it ( wrpc, ( ) ) . await ?;
861
+ println ! ( "current temp in fahrenheit is {}" , current_temp. degrees) ;
862
+ let in_celsius: Celsius = convert_to_celsius ( wrpc, ( ) , & current_temp) . await ?;
863
+ println ! ( "current temp in celsius is {}" , in_celsius. degrees) ;
864
+ Ok ( ( ) )
865
+ }
821
866
}
0 commit comments