Skip to content

Commit d42ec29

Browse files
committed
fix: wit-bindgen-wrpc documentation
Signed-off-by: Roman Volosatovs <[email protected]>
1 parent 47114f6 commit d42ec29

File tree

6 files changed

+302
-177
lines changed

6 files changed

+302
-177
lines changed

Cargo.lock

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/wit-bindgen-rust/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@ wit-bindgen-core = { workspace = true }
2727
wrpc-introspect = { workspace = true }
2828

2929
[dev-dependencies]
30+
bytes = { workspace = true }
31+
futures = { workspace = true }
3032
serde = { workspace = true, features = ["derive"] }
3133
serde_json = { workspace = true }
3234
test-helpers = { workspace = true }
35+
tokio = { workspace = true }
3336
wit-bindgen-wrpc = { path = "../wit-bindgen" }
3437
wrpc-transport = { workspace = true }

crates/wit-bindgen-rust/tests/codegen.rs

Lines changed: 155 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -594,12 +594,12 @@ mod simple_with_option {
594594
mod multiple_paths {
595595
wit_bindgen_wrpc::generate!({
596596
inline: r#"
597-
package test:paths;
597+
package test:paths;
598598
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+
}
603603
"#,
604604
path: ["tests/wit/path1", "tests/wit/path2"],
605605
generate_all,
@@ -610,20 +610,20 @@ mod multiple_paths {
610610
mod interface_export_example {
611611
wit_bindgen_wrpc::generate!({
612612
inline: r#"
613-
package my:test;
613+
package my:test;
614614
615-
interface a {
616-
type my-type = u32;
617-
}
615+
interface a {
616+
type my-type = u32;
617+
}
618618
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};
622622
623-
foo: func() -> my-type;
624-
}
625-
}
626-
"#,
623+
foo: func() -> my-type;
624+
}
625+
}
626+
"#,
627627
});
628628

629629
#[derive(Clone)]
@@ -648,41 +648,45 @@ mod interface_export_example {
648648
})
649649
}
650650
}
651-
652651
#[allow(unused)]
653652
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};
655658

656659
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+
"#,
679682
});
680683

681684
use exports::my::test::logging::{Handler, HandlerLogger, Level, Logger};
682-
use wrpc_transport::{ResourceBorrow, ResourceOwn};
683685

684-
#[derive(Clone)]
685-
struct MyComponent;
686+
#[derive(Clone, Default)]
687+
struct MyComponent {
688+
loggers: Arc<RwLock<Vec<MyLogger>>>,
689+
}
686690

687691
// Note that the `logging` interface has no methods of its own but a trait
688692
// is required to be implemented here to specify the type of `Logger`.
@@ -695,55 +699,65 @@ mod resource_example {
695699

696700
impl<Ctx: Send> HandlerLogger<Ctx> for MyComponent {
697701
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)))
704709
}
705710

706711
async fn log(
707712
&self,
708713
cx: Ctx,
709-
self_: ResourceBorrow<Logger>,
714+
logger: ResourceBorrow<Logger>,
710715
level: Level,
711716
msg: String,
712717
) -> 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(())
720728
}
721729

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())
725737
}
726738

727739
async fn set_level(
728740
&self,
729741
cx: Ctx,
730-
self_: ResourceBorrow<Logger>,
742+
logger: ResourceBorrow<Logger>,
731743
level: Level,
732744
) -> 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(())
737751
}
738752
}
739753

740754
async fn serve_exports(wrpc: &impl wrpc_transport::Serve) {
741-
use wit_bindgen_wrpc::futures::stream::TryStreamExt as _;
755+
use futures::stream::TryStreamExt as _;
742756

743-
let invocations = serve(wrpc, MyComponent).await.unwrap();
757+
let invocations = serve(wrpc, MyComponent::default()).await.unwrap();
744758
let invocations = std::thread::spawn(|| invocations).join().unwrap();
745759
invocations.into_iter().for_each(|(instance, name, st)| {
746-
wit_bindgen_wrpc::tokio::spawn(async move {
760+
tokio::spawn(async move {
747761
eprintln!("serving {instance} {name}");
748762
st.try_collect::<Vec<_>>().await.unwrap();
749763
});
@@ -755,67 +769,98 @@ mod resource_example {
755769
mod example_4 {
756770
wit_bindgen_wrpc::generate!({
757771
inline: r#"
758-
package example:exported-resources;
759-
760-
world import-some-resources {
761-
export logging;
762-
}
772+
package example:exported-resources;
763773
764-
interface logging {
765-
enum level {
766-
debug,
767-
info,
768-
warn,
769-
error,
774+
world import-some-resources {
775+
export logging;
770776
}
771-
resource logger {
772-
constructor(max-level: level);
773777
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);
776790
777-
log: func(level: level, msg: string);
791+
log: func(level: level, msg: string);
792+
}
778793
}
779-
}
780-
"#,
794+
"#,
781795
});
782796
}
783797

784798
#[allow(unused)]
785799
mod async_test {
786800
wit_bindgen_wrpc::generate!({
787801
inline: r#"
788-
package wrpc-test:async;
802+
package wrpc-test:async;
789803
790-
world async {
791-
import handler;
792-
export handler;
793-
}
804+
world async {
805+
import handler;
806+
export handler;
807+
}
794808
795-
interface handler {
796-
use types.{request, response};
809+
interface handler {
810+
use types.{request, response};
797811
798-
handle: func(request: request) -> result<response, string>;
799-
}
812+
handle: func(request: request) -> result<response, string>;
813+
}
800814
801-
interface types {
802-
type fields = list<tuple<string, list<list<u8>>>>;
815+
interface types {
816+
type fields = list<tuple<string, list<list<u8>>>>;
803817
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+
}
810832
}
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;
811849
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;
817855
}
818-
}
819-
"#,
856+
",
820857
});
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+
}
821866
}

0 commit comments

Comments
 (0)