Compare commits
No commits in common. "main" and "syndicate-schema-plugin-v0.2.1" have entirely different histories.
main
...
syndicate-
|
@ -1,24 +0,0 @@
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: docker
|
|
||||||
container:
|
|
||||||
image: git.syndicate-lang.org/syndicate-lang/rust-builder:latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- run: CROSS_CONTAINER_IN_CONTAINER=true make ci-release
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: syndicate-server-x86_64
|
|
||||||
path: target/dist/x86_64
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: syndicate-server-aarch64
|
|
||||||
path: target/dist/aarch64
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: syndicate-server-armv7
|
|
||||||
path: target/dist/armv7
|
|
|
@ -1,7 +0,0 @@
|
||||||
FROM rust:latest
|
|
||||||
RUN cargo install cross
|
|
||||||
|
|
||||||
# This is necessary for cross to be able to access /var/run/docker.sock
|
|
||||||
COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/
|
|
||||||
|
|
||||||
RUN curl -fsSL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh && bash nodesource_setup.sh && rm -f nodesource_setup.sh && apt -y install nodejs && apt clean
|
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# You need to have already logged in:
|
|
||||||
#
|
|
||||||
# docker login git.syndicate-lang.org
|
|
||||||
#
|
|
||||||
# Use a token with read-only access to user scope, this seems to be sufficient (!)
|
|
||||||
|
|
||||||
set -e
|
|
||||||
docker build -t git.syndicate-lang.org/syndicate-lang/rust-builder .
|
|
||||||
docker push git.syndicate-lang.org/syndicate-lang/rust-builder
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,9 +2,9 @@ cargo-features = ["strip"]
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"syndicate-schema-plugin",
|
|
||||||
"syndicate",
|
"syndicate",
|
||||||
"syndicate-macros",
|
"syndicate-macros",
|
||||||
|
"syndicate-schema-plugin",
|
||||||
"syndicate-server",
|
"syndicate-server",
|
||||||
"syndicate-tools",
|
"syndicate-tools",
|
||||||
]
|
]
|
||||||
|
|
24
Makefile
24
Makefile
|
@ -1,5 +1,3 @@
|
||||||
__ignored__ := $(shell ./setup.sh)
|
|
||||||
|
|
||||||
# Use cargo release to manage publication and versions etc.
|
# Use cargo release to manage publication and versions etc.
|
||||||
#
|
#
|
||||||
# cargo install cargo-release
|
# cargo install cargo-release
|
||||||
|
@ -34,7 +32,7 @@ pull-protocols:
|
||||||
static: static-x86_64
|
static: static-x86_64
|
||||||
|
|
||||||
static-%:
|
static-%:
|
||||||
CARGO_TARGET_DIR=target/target.$* cross build --target $*-unknown-linux-musl --features vendored-openssl,jemalloc
|
cross build --target $*-unknown-linux-musl --features vendored-openssl,jemalloc
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
|
@ -56,18 +54,18 @@ static-%:
|
||||||
x86_64-binary: x86_64-binary-release
|
x86_64-binary: x86_64-binary-release
|
||||||
|
|
||||||
x86_64-binary-release:
|
x86_64-binary-release:
|
||||||
CARGO_TARGET_DIR=target/target.x86_64 cross build --target x86_64-unknown-linux-musl --release --all-targets --features vendored-openssl,jemalloc
|
cross build --target x86_64-unknown-linux-musl --release --all-targets --features vendored-openssl,jemalloc
|
||||||
|
|
||||||
x86_64-binary-debug:
|
x86_64-binary-debug:
|
||||||
CARGO_TARGET_DIR=target/target.x86_64 cross build --target x86_64-unknown-linux-musl --all-targets --features vendored-openssl
|
cross build --target x86_64-unknown-linux-musl --all-targets --features vendored-openssl
|
||||||
|
|
||||||
armv7-binary: armv7-binary-release
|
armv7-binary: armv7-binary-release
|
||||||
|
|
||||||
armv7-binary-release:
|
armv7-binary-release:
|
||||||
CARGO_TARGET_DIR=target/target.armv7 cross build --target=armv7-unknown-linux-musleabihf --release --all-targets --features vendored-openssl
|
cross build --target=armv7-unknown-linux-musleabihf --release --all-targets --features vendored-openssl
|
||||||
|
|
||||||
armv7-binary-debug:
|
armv7-binary-debug:
|
||||||
CARGO_TARGET_DIR=target/target.armv7 cross build --target=armv7-unknown-linux-musleabihf --all-targets --features vendored-openssl
|
cross build --target=armv7-unknown-linux-musleabihf --all-targets --features vendored-openssl
|
||||||
|
|
||||||
# As of 2023-05-12 (and probably earlier!) this is no longer required with current Rust nightlies
|
# As of 2023-05-12 (and probably earlier!) this is no longer required with current Rust nightlies
|
||||||
# # Hack to workaround https://github.com/rust-embedded/cross/issues/598
|
# # Hack to workaround https://github.com/rust-embedded/cross/issues/598
|
||||||
|
@ -76,15 +74,7 @@ armv7-binary-debug:
|
||||||
aarch64-binary: aarch64-binary-release
|
aarch64-binary: aarch64-binary-release
|
||||||
|
|
||||||
aarch64-binary-release:
|
aarch64-binary-release:
|
||||||
CARGO_TARGET_DIR=target/target.aarch64 cross build --target=aarch64-unknown-linux-musl --release --all-targets --features vendored-openssl,jemalloc
|
cross build --target=aarch64-unknown-linux-musl --release --all-targets --features vendored-openssl,jemalloc
|
||||||
|
|
||||||
aarch64-binary-debug:
|
aarch64-binary-debug:
|
||||||
CARGO_TARGET_DIR=target/target.aarch64 cross build --target=aarch64-unknown-linux-musl --all-targets --features vendored-openssl
|
cross build --target=aarch64-unknown-linux-musl --all-targets --features vendored-openssl
|
||||||
|
|
||||||
ci-release: x86_64-binary-release aarch64-binary-release armv7-binary-release
|
|
||||||
rm -rf target/dist
|
|
||||||
for arch in x86_64 aarch64 armv7; do \
|
|
||||||
mkdir -p target/dist/$$arch; \
|
|
||||||
cp -a target/target.$$arch/$$arch-unknown-linux-musl*/release/syndicate-macaroon target/dist/$$arch; \
|
|
||||||
cp -a target/target.$$arch/$$arch-unknown-linux-musl*/release/syndicate-server target/dist/$$arch; \
|
|
||||||
done
|
|
||||||
|
|
|
@ -1,7 +1,2 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
TASKSET='taskset -c 0,1'
|
make -C ../syndicate-server binary && exec taskset -c 0,1 ../target/release/syndicate-server -c benchmark-config.pr "$@"
|
||||||
if [ $(uname -s) = 'Darwin' ]
|
|
||||||
then
|
|
||||||
TASKSET=
|
|
||||||
fi
|
|
||||||
make -C ../syndicate-server binary && exec $TASKSET ../target/release/syndicate-server -c benchmark-config.pr "$@"
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ all:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f syndicate-server.*
|
rm -f syndicate-server.*
|
||||||
|
rm -rf $(patsubst %,target.%,$(ARCHITECTURES))
|
||||||
-podman images -q $(U)/$(I) | sort -u | xargs podman rmi -f
|
-podman images -q $(U)/$(I) | sort -u | xargs podman rmi -f
|
||||||
|
|
||||||
image: $(SERVERS)
|
image: $(SERVERS)
|
||||||
|
@ -33,5 +34,5 @@ push-only:
|
||||||
podman manifest push $(U)/$(I):latest
|
podman manifest push $(U)/$(I):latest
|
||||||
|
|
||||||
syndicate-server.%:
|
syndicate-server.%:
|
||||||
make -C .. $$(./alpine-architecture $*)-binary-release
|
make -C .. CARGO_TARGET_DIR=docker/target.$* $$(./alpine-architecture $*)-binary-release
|
||||||
cp -a ../target/target.$$(./alpine-architecture $*)/$$(./alpine-architecture $*)-unknown-linux-musl*/release/syndicate-server $@
|
cp -a target.$*/$$(./alpine-architecture $*)-unknown-linux-musl*/release/syndicate-server $@
|
||||||
|
|
|
@ -95,58 +95,3 @@ $world [
|
||||||
? <labelled _ <Observe <rec Says ?p> ?o>> <Observe <rec Says $p> $o>
|
? <labelled _ <Observe <rec Says ?p> ?o>> <Observe <rec Says $p> $o>
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# We can also use sturdyref rewrites to directly handle `Says` and
|
|
||||||
# `Present` values, rather than wrapping with `<labelled ...>` and
|
|
||||||
# unwrapping using the script fragment just above.
|
|
||||||
#
|
|
||||||
# The multiply-quoted patterns in the `Observe` cases start to get unwieldy
|
|
||||||
# at this point!
|
|
||||||
#
|
|
||||||
# For Alice:
|
|
||||||
#
|
|
||||||
# syndicate-macaroon mint --oid a-service --phrase hello --caveat '<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "alice">]>>
|
|
||||||
# <rewrite <rec Says [<_> <bind String>]> <rec Says [<lit "alice"> <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present> <_>]> <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says> <_>]> <_>]>> <ref 0>>
|
|
||||||
# ]>'
|
|
||||||
#
|
|
||||||
# <ref { oid: a-service sig: #[s918Jk6As8AWJ9rtozOTlg] caveats: [<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "alice">]>>
|
|
||||||
# <rewrite <rec Says [<_>, <bind String>]> <rec Says [<lit "alice">, <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present>, <_>]>, <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says>, <_>]>, <_>]>> <ref 0>> ]>]}>
|
|
||||||
#
|
|
||||||
# <route [<ws "wss://generic-dataspace.demo.leastfixedpoint.com/">]
|
|
||||||
# <noise { key: #[z1w/OLy0wi3Veyk8/D+2182YxcrKpgc8y0ZJEBDrmWs],
|
|
||||||
# service: world }>
|
|
||||||
# <ref { oid: a-service sig: #[s918Jk6As8AWJ9rtozOTlg] caveats: [<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "alice">]>>
|
|
||||||
# <rewrite <rec Says [<_>, <bind String>]> <rec Says [<lit "alice">, <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present>, <_>]>, <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says>, <_>]>, <_>]>> <ref 0>> ]>]}>>
|
|
||||||
#
|
|
||||||
# For Bob:
|
|
||||||
#
|
|
||||||
# syndicate-macaroon mint --oid a-service --phrase hello --caveat '<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "bob">]>>
|
|
||||||
# <rewrite <rec Says [<_> <bind String>]> <rec Says [<lit "bob"> <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present> <_>]> <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says> <_>]> <_>]>> <ref 0>>
|
|
||||||
# ]>'
|
|
||||||
#
|
|
||||||
# <ref { oid: a-service sig: #[QBbV4LrS0i3BG6OyCPJl+A] caveats: [<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "bob">]>>
|
|
||||||
# <rewrite <rec Says [<_>, <bind String>]> <rec Says [<lit "bob">, <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present>, <_>]>, <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says>, <_>]>, <_>]>> <ref 0>> ]>]}>
|
|
||||||
#
|
|
||||||
# <route [<ws "wss://generic-dataspace.demo.leastfixedpoint.com/">]
|
|
||||||
# <noise { key: #[z1w/OLy0wi3Veyk8/D+2182YxcrKpgc8y0ZJEBDrmWs],
|
|
||||||
# service: world }>
|
|
||||||
# <ref { oid: a-service sig: #[QBbV4LrS0i3BG6OyCPJl+A] caveats: [<or [
|
|
||||||
# <rewrite <rec Present [<_>]> <rec Present [<lit "bob">]>>
|
|
||||||
# <rewrite <rec Says [<_>, <bind String>]> <rec Says [<lit "bob">, <ref 0>]>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Present>, <_>]>, <_>]>> <ref 0>>
|
|
||||||
# <rewrite <bind <rec Observe [<rec rec [<lit Says>, <_>]>, <_>]>> <ref 0>> ]>]}>>
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
exec 1>&2
|
|
||||||
|
|
||||||
failed=
|
|
||||||
cmp_and_fail() {
|
|
||||||
if ! cmp "$1" "$2"
|
|
||||||
then
|
|
||||||
failed=failed
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
COMMAND=cmp_and_fail
|
|
||||||
if [ "$1" = "--fix" ];
|
|
||||||
then
|
|
||||||
COMMAND=cp
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure that various copies of cross-package data are identical.
|
|
||||||
${COMMAND} syndicate/protocols/schema-bundle.bin syndicate-schema-plugin/schema-bundle.bin
|
|
||||||
|
|
||||||
[ -z "$failed" ]
|
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
rustup update
|
|
||||||
cargo +nightly install --path `pwd`/syndicate-server
|
|
18
setup.sh
18
setup.sh
|
@ -1,18 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Set up a git checkout of this repository for local dev use.
|
|
||||||
|
|
||||||
exec 2>/dev/tty 1>&2
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
[ -d .git ] || exit 0
|
|
||||||
|
|
||||||
for fullhook in ./git-hooks/*
|
|
||||||
do
|
|
||||||
hook=$(basename "$fullhook")
|
|
||||||
[ -L .git/hooks/$hook ] || (
|
|
||||||
echo "Installing $hook hook"
|
|
||||||
ln -s ../../git-hooks/$hook .git/hooks/$hook
|
|
||||||
)
|
|
||||||
done
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "syndicate-macros"
|
name = "syndicate-macros"
|
||||||
version = "0.33.0"
|
version = "0.25.0"
|
||||||
authors = ["Tony Garnock-Jones <tonyg@leastfixedpoint.com>"]
|
authors = ["Tony Garnock-Jones <tonyg@leastfixedpoint.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ license = "Apache-2.0"
|
||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
syndicate = { path = "../syndicate", version = "0.41.0"}
|
syndicate = { path = "../syndicate", version = "0.31.0"}
|
||||||
|
|
||||||
proc-macro2 = { version = "^1.0", features = ["span-locations"] }
|
proc-macro2 = { version = "^1.0", features = ["span-locations"] }
|
||||||
quote = "^1.0"
|
quote = "^1.0"
|
||||||
|
|
|
@ -5,11 +5,11 @@ use std::sync::Arc;
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Instruction {
|
enum Instruction {
|
||||||
SetPeer(Arc<Ref<Instruction>>),
|
SetPeer(Arc<Ref<Instruction>>),
|
||||||
HandleMessage(u64),
|
HandleMessage(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Forwarder {
|
struct Forwarder {
|
||||||
hop_limit: u64,
|
n_rounds: u32,
|
||||||
supervisor: Arc<Ref<Instruction>>,
|
supervisor: Arc<Ref<Instruction>>,
|
||||||
peer: Option<Arc<Ref<Instruction>>>,
|
peer: Option<Arc<Ref<Instruction>>>,
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ impl Entity<Instruction> for Forwarder {
|
||||||
self.peer = Some(r);
|
self.peer = Some(r);
|
||||||
}
|
}
|
||||||
Instruction::HandleMessage(n) => {
|
Instruction::HandleMessage(n) => {
|
||||||
let target = if n >= self.hop_limit { &self.supervisor } else { self.peer.as_ref().expect("peer") };
|
let target = if n >= self.n_rounds { &self.supervisor } else { self.peer.as_ref().expect("peer") };
|
||||||
turn.message(target, Instruction::HandleMessage(n + 1));
|
turn.message(target, Instruction::HandleMessage(n + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,8 +40,8 @@ impl Entity<Instruction> for Forwarder {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Supervisor {
|
struct Supervisor {
|
||||||
latency_mode: bool,
|
n_actors: u32,
|
||||||
total_transfers: u64,
|
n_rounds: u32,
|
||||||
remaining_to_receive: u32,
|
remaining_to_receive: u32,
|
||||||
start_time: Option<std::time::Instant>,
|
start_time: Option<std::time::Instant>,
|
||||||
}
|
}
|
||||||
|
@ -58,11 +58,11 @@ impl Entity<Instruction> for Supervisor {
|
||||||
if self.remaining_to_receive == 0 {
|
if self.remaining_to_receive == 0 {
|
||||||
let stop_time = std::time::Instant::now();
|
let stop_time = std::time::Instant::now();
|
||||||
let duration = stop_time - self.start_time.unwrap();
|
let duration = stop_time - self.start_time.unwrap();
|
||||||
tracing::info!("Stop after {:?}; {:?} messages, so {:?} Hz ({} mode)",
|
let n_messages: u64 = self.n_actors as u64 * self.n_rounds as u64;
|
||||||
|
tracing::info!("Stop after {:?}; {:?} messages, so {:?} Hz",
|
||||||
duration,
|
duration,
|
||||||
self.total_transfers,
|
n_messages,
|
||||||
(1000.0 * self.total_transfers as f64) / duration.as_millis() as f64,
|
(1000.0 * n_messages as f64) / duration.as_millis() as f64);
|
||||||
if self.latency_mode { "latency" } else { "throughput" });
|
|
||||||
turn.stop_root();
|
turn.stop_root();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -78,24 +78,12 @@ async fn main() -> ActorResult {
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
let n_actors: u32 = args.get(1).unwrap_or(&"1000000".to_string()).parse()?;
|
let n_actors: u32 = args.get(1).unwrap_or(&"1000000".to_string()).parse()?;
|
||||||
let n_rounds: u32 = args.get(2).unwrap_or(&"200".to_string()).parse()?;
|
let n_rounds: u32 = args.get(2).unwrap_or(&"200".to_string()).parse()?;
|
||||||
let latency_mode: bool = match args.get(3).unwrap_or(&"throughput".to_string()).as_str() {
|
|
||||||
"latency" => true,
|
|
||||||
"throughput" => false,
|
|
||||||
_other => return Err("Invalid throughput/latency mode".into()),
|
|
||||||
};
|
|
||||||
tracing::info!("Will run {:?} actors for {:?} rounds", n_actors, n_rounds);
|
tracing::info!("Will run {:?} actors for {:?} rounds", n_actors, n_rounds);
|
||||||
|
|
||||||
let total_transfers: u64 = n_actors as u64 * n_rounds as u64;
|
|
||||||
let (hop_limit, injection_count) = if latency_mode {
|
|
||||||
(total_transfers, 1)
|
|
||||||
} else {
|
|
||||||
(n_rounds as u64, n_actors)
|
|
||||||
};
|
|
||||||
|
|
||||||
let me = t.create(Supervisor {
|
let me = t.create(Supervisor {
|
||||||
latency_mode,
|
n_actors,
|
||||||
total_transfers,
|
n_rounds,
|
||||||
remaining_to_receive: injection_count,
|
remaining_to_receive: n_actors,
|
||||||
start_time: None,
|
start_time: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -105,7 +93,7 @@ async fn main() -> ActorResult {
|
||||||
forwarders.push(
|
forwarders.push(
|
||||||
t.spawn_for_entity(None, true, Box::new(
|
t.spawn_for_entity(None, true, Box::new(
|
||||||
Forwarder {
|
Forwarder {
|
||||||
hop_limit,
|
n_rounds,
|
||||||
supervisor: me.clone(),
|
supervisor: me.clone(),
|
||||||
peer: forwarders.last().cloned(),
|
peer: forwarders.last().cloned(),
|
||||||
}))
|
}))
|
||||||
|
@ -115,13 +103,8 @@ async fn main() -> ActorResult {
|
||||||
t.later(move |t| {
|
t.later(move |t| {
|
||||||
t.message(&me, Instruction::SetPeer(me.clone()));
|
t.message(&me, Instruction::SetPeer(me.clone()));
|
||||||
t.later(move |t| {
|
t.later(move |t| {
|
||||||
let mut injected: u32 = 0;
|
|
||||||
for f in forwarders.into_iter() {
|
for f in forwarders.into_iter() {
|
||||||
if injected >= injection_count {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
t.message(&f, Instruction::HandleMessage(0));
|
t.message(&f, Instruction::HandleMessage(0));
|
||||||
injected += 1;
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,175 +0,0 @@
|
||||||
use std::env;
|
|
||||||
use std::sync::Arc;
|
|
||||||
use std::sync::atomic::AtomicU64;
|
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
|
|
||||||
use tokio::sync::mpsc::{unbounded_channel, UnboundedSender};
|
|
||||||
|
|
||||||
type Ref<T> = UnboundedSender<Box<T>>;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum Instruction {
|
|
||||||
SetPeer(Arc<Ref<Instruction>>),
|
|
||||||
HandleMessage(u64),
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Forwarder {
|
|
||||||
hop_limit: u64,
|
|
||||||
supervisor: Arc<Ref<Instruction>>,
|
|
||||||
peer: Option<Arc<Ref<Instruction>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for Forwarder {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let r = self.peer.take();
|
|
||||||
let _ = tokio::spawn(async move {
|
|
||||||
drop(r);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Action { Continue, Stop }
|
|
||||||
|
|
||||||
trait Actor<T> {
|
|
||||||
fn message(&mut self, message: T) -> Action;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn send<T: std::marker::Send + 'static>(ch: &Arc<Ref<T>>, message: T) -> () {
|
|
||||||
match ch.send(Box::new(message)) {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(v) => panic!("Aiee! Could not send {:?}", v),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn spawn<T: std::marker::Send + 'static, R: Actor<T> + std::marker::Send + 'static>(rt: Option<Arc<AtomicU64>>, mut ac: R) -> Arc<Ref<T>> {
|
|
||||||
let (tx, mut rx) = unbounded_channel::<Box<T>>();
|
|
||||||
if let Some(ref c) = rt {
|
|
||||||
c.fetch_add(1, Ordering::SeqCst);
|
|
||||||
}
|
|
||||||
tokio::spawn(async move {
|
|
||||||
loop {
|
|
||||||
match rx.recv().await {
|
|
||||||
None => break,
|
|
||||||
Some(message) => {
|
|
||||||
match ac.message(*message) {
|
|
||||||
Action::Continue => continue,
|
|
||||||
Action::Stop => break,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if let Some(c) = rt {
|
|
||||||
c.fetch_sub(1, Ordering::SeqCst);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Arc::new(tx)
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Actor<Instruction> for Forwarder {
|
|
||||||
fn message(&mut self, message: Instruction) -> Action {
|
|
||||||
match message {
|
|
||||||
Instruction::SetPeer(r) => {
|
|
||||||
tracing::info!("Setting peer {:?}", r);
|
|
||||||
self.peer = Some(r);
|
|
||||||
}
|
|
||||||
Instruction::HandleMessage(n) => {
|
|
||||||
let target = if n >= self.hop_limit { &self.supervisor } else { self.peer.as_ref().expect("peer") };
|
|
||||||
send(target, Instruction::HandleMessage(n + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Action::Continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Supervisor {
|
|
||||||
latency_mode: bool,
|
|
||||||
total_transfers: u64,
|
|
||||||
remaining_to_receive: u32,
|
|
||||||
start_time: Option<std::time::Instant>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Actor<Instruction> for Supervisor {
|
|
||||||
fn message(&mut self, message: Instruction) -> Action {
|
|
||||||
match message {
|
|
||||||
Instruction::SetPeer(_) => {
|
|
||||||
tracing::info!("Start");
|
|
||||||
self.start_time = Some(std::time::Instant::now());
|
|
||||||
},
|
|
||||||
Instruction::HandleMessage(_n) => {
|
|
||||||
self.remaining_to_receive -= 1;
|
|
||||||
if self.remaining_to_receive == 0 {
|
|
||||||
let stop_time = std::time::Instant::now();
|
|
||||||
let duration = stop_time - self.start_time.unwrap();
|
|
||||||
tracing::info!("Stop after {:?}; {:?} messages, so {:?} Hz ({} mode)",
|
|
||||||
duration,
|
|
||||||
self.total_transfers,
|
|
||||||
(1000.0 * self.total_transfers as f64) / duration.as_millis() as f64,
|
|
||||||
if self.latency_mode { "latency" } else { "throughput" });
|
|
||||||
return Action::Stop;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
Action::Continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::main]
|
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>> {
|
|
||||||
syndicate::convenient_logging()?;
|
|
||||||
|
|
||||||
let args: Vec<String> = env::args().collect();
|
|
||||||
let n_actors: u32 = args.get(1).unwrap_or(&"1000000".to_string()).parse()?;
|
|
||||||
let n_rounds: u32 = args.get(2).unwrap_or(&"200".to_string()).parse()?;
|
|
||||||
let latency_mode: bool = match args.get(3).unwrap_or(&"throughput".to_string()).as_str() {
|
|
||||||
"latency" => true,
|
|
||||||
"throughput" => false,
|
|
||||||
_other => return Err("Invalid throughput/latency mode".into()),
|
|
||||||
};
|
|
||||||
tracing::info!("Will run {:?} actors for {:?} rounds", n_actors, n_rounds);
|
|
||||||
|
|
||||||
let count = Arc::new(AtomicU64::new(0));
|
|
||||||
|
|
||||||
let total_transfers: u64 = n_actors as u64 * n_rounds as u64;
|
|
||||||
let (hop_limit, injection_count) = if latency_mode {
|
|
||||||
(total_transfers, 1)
|
|
||||||
} else {
|
|
||||||
(n_rounds as u64, n_actors)
|
|
||||||
};
|
|
||||||
|
|
||||||
let me = spawn(Some(count.clone()), Supervisor {
|
|
||||||
latency_mode,
|
|
||||||
total_transfers,
|
|
||||||
remaining_to_receive: injection_count,
|
|
||||||
start_time: None,
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut forwarders: Vec<Arc<Ref<Instruction>>> = Vec::new();
|
|
||||||
for _i in 0 .. n_actors {
|
|
||||||
if _i % 10000 == 0 { tracing::info!("Actor {:?}", _i); }
|
|
||||||
forwarders.push(spawn(None, Forwarder {
|
|
||||||
hop_limit,
|
|
||||||
supervisor: me.clone(),
|
|
||||||
peer: forwarders.last().cloned(),
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
send(&forwarders[0], Instruction::SetPeer(forwarders.last().expect("an entity").clone()));
|
|
||||||
send(&me, Instruction::SetPeer(me.clone()));
|
|
||||||
|
|
||||||
let mut injected: u32 = 0;
|
|
||||||
for f in forwarders.into_iter() {
|
|
||||||
if injected >= injection_count {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
send(&f, Instruction::HandleMessage(0));
|
|
||||||
injected += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
loop {
|
|
||||||
if count.load(Ordering::SeqCst) == 0 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
|
@ -27,7 +27,6 @@ use pat::lit;
|
||||||
|
|
||||||
enum SymbolVariant<'a> {
|
enum SymbolVariant<'a> {
|
||||||
Normal(&'a str),
|
Normal(&'a str),
|
||||||
#[allow(dead_code)] // otherwise we get 'warning: field `0` is never read'
|
|
||||||
Binder(&'a str),
|
Binder(&'a str),
|
||||||
Substitution(&'a str),
|
Substitution(&'a str),
|
||||||
Discard,
|
Discard,
|
||||||
|
@ -36,7 +35,7 @@ enum SymbolVariant<'a> {
|
||||||
fn compile_sequence_members(vs: &[IOValue]) -> Vec<TokenStream> {
|
fn compile_sequence_members(vs: &[IOValue]) -> Vec<TokenStream> {
|
||||||
vs.iter().enumerate().map(|(i, f)| {
|
vs.iter().enumerate().map(|(i, f)| {
|
||||||
let p = compile_pattern(f);
|
let p = compile_pattern(f);
|
||||||
quote!((syndicate::value::Value::from(#i).wrap(), #p))
|
quote!((#i .into(), #p))
|
||||||
}).collect::<Vec<_>>()
|
}).collect::<Vec<_>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +79,10 @@ impl ValueCompiler {
|
||||||
match v.value() {
|
match v.value() {
|
||||||
Value::Boolean(b) =>
|
Value::Boolean(b) =>
|
||||||
quote!(#V_::Value::from(#b).wrap()),
|
quote!(#V_::Value::from(#b).wrap()),
|
||||||
|
Value::Float(f) => {
|
||||||
|
let f = f.0;
|
||||||
|
quote!(#V_::Value::from(#f).wrap())
|
||||||
|
}
|
||||||
Value::Double(d) => {
|
Value::Double(d) => {
|
||||||
let d = d.0;
|
let d = d.0;
|
||||||
quote!(#V_::Value::from(#d).wrap())
|
quote!(#V_::Value::from(#d).wrap())
|
||||||
|
@ -151,14 +154,16 @@ fn compile_pattern(v: &IOValue) -> TokenStream {
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
let V_: TokenStream = quote!(syndicate::value);
|
let V_: TokenStream = quote!(syndicate::value);
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
let MapFrom_: TokenStream = quote!(<#V_::Map<_, _>>::from);
|
let MapFromIterator_: TokenStream = quote!(<#V_::Map<_, _> as std::iter::FromIterator<_>>::from_iter);
|
||||||
|
|
||||||
match v.value() {
|
match v.value() {
|
||||||
Value::Symbol(s) => match analyze_symbol(&s, true) {
|
Value::Symbol(s) => match analyze_symbol(&s, true) {
|
||||||
SymbolVariant::Binder(_) =>
|
SymbolVariant::Binder(_) =>
|
||||||
quote!(#P_::Pattern::Bind{ pattern: Box::new(#P_::Pattern::Discard) }),
|
quote!(#P_::Pattern::DBind(Box::new(#P_::DBind {
|
||||||
|
pattern: #P_::Pattern::DDiscard(Box::new(#P_::DDiscard))
|
||||||
|
}))),
|
||||||
SymbolVariant::Discard =>
|
SymbolVariant::Discard =>
|
||||||
quote!(#P_::Pattern::Discard),
|
quote!(#P_::Pattern::DDiscard(Box::new(#P_::DDiscard))),
|
||||||
SymbolVariant::Substitution(s) =>
|
SymbolVariant::Substitution(s) =>
|
||||||
lit(Ident::new(s, Span::call_site())),
|
lit(Ident::new(s, Span::call_site())),
|
||||||
SymbolVariant::Normal(_) =>
|
SymbolVariant::Normal(_) =>
|
||||||
|
@ -170,7 +175,9 @@ fn compile_pattern(v: &IOValue) -> TokenStream {
|
||||||
Some(label) =>
|
Some(label) =>
|
||||||
if label.starts_with("$") && r.arity() == 1 {
|
if label.starts_with("$") && r.arity() == 1 {
|
||||||
let nested = compile_pattern(&r.fields()[0]);
|
let nested = compile_pattern(&r.fields()[0]);
|
||||||
quote!(#P_::Pattern::Bind{ pattern: Box::new(#nested) })
|
quote!(#P_::Pattern::DBind(Box::new(#P_::DBind {
|
||||||
|
pattern: #nested
|
||||||
|
})))
|
||||||
} else {
|
} else {
|
||||||
let label_stx = if label.starts_with("=") {
|
let label_stx = if label.starts_with("=") {
|
||||||
let id = Ident::new(&label[1..], Span::call_site());
|
let id = Ident::new(&label[1..], Span::call_site());
|
||||||
|
@ -179,19 +186,18 @@ fn compile_pattern(v: &IOValue) -> TokenStream {
|
||||||
quote!(#V_::Value::symbol(#label).wrap())
|
quote!(#V_::Value::symbol(#label).wrap())
|
||||||
};
|
};
|
||||||
let members = compile_sequence_members(r.fields());
|
let members = compile_sequence_members(r.fields());
|
||||||
quote!(#P_::Pattern::Group {
|
quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Rec {
|
||||||
type_: Box::new(#P_::GroupType::Rec { label: #label_stx }),
|
label: #label_stx,
|
||||||
entries: #MapFrom_([#(#members),*]),
|
fields: vec![#(#members),*],
|
||||||
})
|
})))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Value::Sequence(vs) => {
|
Value::Sequence(vs) => {
|
||||||
let members = compile_sequence_members(vs);
|
let members = compile_sequence_members(vs);
|
||||||
quote!(#P_::Pattern::Group {
|
quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Arr {
|
||||||
type_: Box::new(#P_::GroupType::Arr),
|
items: vec![#(#members),*],
|
||||||
entries: #MapFrom_([#(#members),*]),
|
})))
|
||||||
})
|
|
||||||
}
|
}
|
||||||
Value::Set(_) =>
|
Value::Set(_) =>
|
||||||
panic!("Cannot match sets in patterns"),
|
panic!("Cannot match sets in patterns"),
|
||||||
|
@ -201,10 +207,9 @@ fn compile_pattern(v: &IOValue) -> TokenStream {
|
||||||
let v = compile_pattern(v);
|
let v = compile_pattern(v);
|
||||||
quote!((#k, #v))
|
quote!((#k, #v))
|
||||||
}).collect::<Vec<_>>();
|
}).collect::<Vec<_>>();
|
||||||
quote!(#P_::Pattern::Group {
|
quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Dict {
|
||||||
type_: Box::new(#P_::GroupType::Dict),
|
entries: #MapFromIterator_(vec![#(#members),*])
|
||||||
entries: #MapFrom_([#(#members),*]),
|
})))
|
||||||
})
|
|
||||||
}
|
}
|
||||||
_ => lit(ValueCompiler::for_patterns().compile(v)),
|
_ => lit(ValueCompiler::for_patterns().compile(v)),
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,9 +15,10 @@ pub fn lit<T: ToTokens>(e: T) -> TokenStream2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compile_sequence_members(stxs: &Vec<Stx>) -> Result<Vec<TokenStream2>, &'static str> {
|
fn compile_sequence_members(stxs: &Vec<Stx>) -> Result<Vec<TokenStream2>, &'static str> {
|
||||||
stxs.iter().enumerate().map(|(i, stx)| {
|
stxs.iter().map(|stx| {
|
||||||
let p = to_pattern_expr(stx)?;
|
// let p = to_pattern_expr(stx)?;
|
||||||
Ok(quote!((syndicate::value::Value::from(#i).wrap(), #p)))
|
// Ok(quote!(#p))
|
||||||
|
to_pattern_expr(stx)
|
||||||
}).collect()
|
}).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ pub fn to_pattern_expr(stx: &Stx) -> Result<TokenStream2, &'static str> {
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
let V_: TokenStream2 = quote!(syndicate::value);
|
let V_: TokenStream2 = quote!(syndicate::value);
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
let MapFrom_: TokenStream2 = quote!(<#V_::Map<_, _>>::from);
|
let MapFromIterator_: TokenStream2 = quote!(<#V_::Map<_, _> as std::iter::FromIterator<_>>::from_iter);
|
||||||
|
|
||||||
match stx {
|
match stx {
|
||||||
Stx::Atom(v) =>
|
Stx::Atom(v) =>
|
||||||
|
@ -40,27 +41,26 @@ pub fn to_pattern_expr(stx: &Stx) -> Result<TokenStream2, &'static str> {
|
||||||
None => to_pattern_expr(&Stx::Discard)?,
|
None => to_pattern_expr(&Stx::Discard)?,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(quote!(#P_::Pattern::Bind { pattern: Box::new(#inner_pat_expr) }))
|
Ok(quote!(#P_::Pattern::DBind(Box::new(#P_::DBind { pattern: #inner_pat_expr }))))
|
||||||
}
|
}
|
||||||
Stx::Subst(e) =>
|
Stx::Subst(e) =>
|
||||||
Ok(lit(e)),
|
Ok(lit(e)),
|
||||||
Stx::Discard =>
|
Stx::Discard =>
|
||||||
Ok(quote!(#P_::Pattern::Discard)),
|
Ok(quote!(#P_::Pattern::DDiscard(Box::new(#P_::DDiscard)))),
|
||||||
|
|
||||||
Stx::Rec(l, fs) => {
|
Stx::Rec(l, fs) => {
|
||||||
let label = to_value_expr(&*l)?;
|
let label = to_value_expr(&*l)?;
|
||||||
let members = compile_sequence_members(fs)?;
|
let members = compile_sequence_members(fs)?;
|
||||||
Ok(quote!(#P_::Pattern::Group {
|
Ok(quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Rec {
|
||||||
type_: Box::new(#P_::GroupType::Rec { label: #label }),
|
label: #label,
|
||||||
entries: #MapFrom_([#(#members),*]),
|
fields: vec![#(#members),*],
|
||||||
}))
|
}))))
|
||||||
},
|
},
|
||||||
Stx::Seq(stxs) => {
|
Stx::Seq(stxs) => {
|
||||||
let members = compile_sequence_members(stxs)?;
|
let members = compile_sequence_members(stxs)?;
|
||||||
Ok(quote!(#P_::Pattern::Group {
|
Ok(quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Arr {
|
||||||
type_: Box::new(#P_::GroupType::Arr),
|
items: vec![#(#members),*],
|
||||||
entries: #MapFrom_([#(#members),*]),
|
}))))
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
Stx::Set(_stxs) =>
|
Stx::Set(_stxs) =>
|
||||||
Err("Set literals not supported in patterns"),
|
Err("Set literals not supported in patterns"),
|
||||||
|
@ -70,10 +70,9 @@ pub fn to_pattern_expr(stx: &Stx) -> Result<TokenStream2, &'static str> {
|
||||||
let v = to_pattern_expr(v)?;
|
let v = to_pattern_expr(v)?;
|
||||||
Ok(quote!((#k, #v)))
|
Ok(quote!((#k, #v)))
|
||||||
}).collect::<Result<Vec<_>, &'static str>>()?;
|
}).collect::<Result<Vec<_>, &'static str>>()?;
|
||||||
Ok(quote!(#P_::Pattern::Group {
|
Ok(quote!(#P_::Pattern::DCompound(Box::new(#P_::DCompound::Dict {
|
||||||
type_: Box::new(#P_::GroupType::Dict),
|
entries: #MapFromIterator_(vec![#(#members),*])
|
||||||
entries: #MapFrom_([#(#members),*])
|
}))))
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ use syn::parse::Parser;
|
||||||
use syn::parse::ParseStream;
|
use syn::parse::ParseStream;
|
||||||
use syn::parse_str;
|
use syn::parse_str;
|
||||||
|
|
||||||
|
use syndicate::value::Float;
|
||||||
use syndicate::value::Double;
|
use syndicate::value::Double;
|
||||||
use syndicate::value::IOValue;
|
use syndicate::value::IOValue;
|
||||||
use syndicate::value::NestedValue;
|
use syndicate::value::NestedValue;
|
||||||
|
@ -265,7 +266,7 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
|
||||||
IOValue::new(i.base10_parse::<i128>()?)
|
IOValue::new(i.base10_parse::<i128>()?)
|
||||||
}
|
}
|
||||||
Lit::Float(f) => if f.suffix() == "f32" {
|
Lit::Float(f) => if f.suffix() == "f32" {
|
||||||
IOValue::new(&Double(f.base10_parse::<f32>()? as f64))
|
IOValue::new(&Float(f.base10_parse::<f32>()?))
|
||||||
} else {
|
} else {
|
||||||
IOValue::new(&Double(f.base10_parse::<f64>()?))
|
IOValue::new(&Double(f.base10_parse::<f64>()?))
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,10 @@ pub fn value_to_value_expr(v: &IOValue) -> TokenStream2 {
|
||||||
match v.value() {
|
match v.value() {
|
||||||
Value::Boolean(b) =>
|
Value::Boolean(b) =>
|
||||||
quote!(#V_::Value::from(#b).wrap()),
|
quote!(#V_::Value::from(#b).wrap()),
|
||||||
|
Value::Float(f) => {
|
||||||
|
let f = f.0;
|
||||||
|
quote!(#V_::Value::from(#f).wrap())
|
||||||
|
}
|
||||||
Value::Double(d) => {
|
Value::Double(d) => {
|
||||||
let d = d.0;
|
let d = d.0;
|
||||||
quote!(#V_::Value::from(#d).wrap())
|
quote!(#V_::Value::from(#d).wrap())
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"folders": [
|
|
||||||
{
|
|
||||||
"path": "."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "../syndicate-protocols"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"settings": {
|
|
||||||
"files.exclude": {
|
|
||||||
"target": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "syndicate-schema-plugin"
|
name = "syndicate-schema-plugin"
|
||||||
version = "0.10.1"
|
version = "0.2.1"
|
||||||
authors = ["Tony Garnock-Jones <tonyg@leastfixedpoint.com>"]
|
authors = ["Tony Garnock-Jones <tonyg@leastfixedpoint.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
@ -11,13 +11,9 @@ license = "Apache-2.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
preserves-schema = "5.995"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
preserves = "4.995"
|
preserves-schema = "5.992"
|
||||||
preserves-schema = "5.995"
|
syndicate = { path = "../syndicate", version = "0.31.0"}
|
||||||
lazy_static = "1.4"
|
|
||||||
|
|
||||||
[package.metadata.workspaces]
|
[package.metadata.workspaces]
|
||||||
independent = true
|
independent = true
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
use preserves_schema::compiler::*;
|
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
|
||||||
let buildroot = std::path::PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
|
|
||||||
|
|
||||||
let mut gen_dir = buildroot.clone();
|
|
||||||
gen_dir.push("src/schemas");
|
|
||||||
|
|
||||||
let mut c = CompilerConfig::new("crate::schemas".to_owned());
|
|
||||||
c.add_external_module(ExternalModule::new(vec!["EntityRef".to_owned()], "crate::placeholder"));
|
|
||||||
|
|
||||||
let inputs = expand_inputs(&vec!["./schema-bundle.bin".to_owned()])?;
|
|
||||||
c.load_schemas_and_bundles(&inputs, &vec![])?;
|
|
||||||
compile(&c, &mut CodeCollector::files(gen_dir))
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
´³bundle·µ³rpc„´³schema·³version°³definitions·³Answer´³rec´³lit³a„´³tupleµ´³named³request³any„´³named³response³any„„„„³Result´³orµµ±ok´³rec´³lit³ok„´³tupleµ´³named³value³any„„„„„µ±error´³rec´³lit³error„´³tupleµ´³named³error³any„„„„„„„³Question´³rec´³lit³q„´³tupleµ´³named³request³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³tcp„´³schema·³version°³definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³ TcpRemote´³rec´³lit³
|
|
||||||
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version°³definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³
|
|
||||||
ByteString„„„„³Headers´³dictof´³atom³Symbol„´³atom³String„„³MimeType´³atom³Symbol„³
|
|
||||||
QueryValue´³orµµ±string´³atom³String„„µ±file´³rec´³lit³file„´³tupleµ´³named³filename´³atom³String„„´³named³headers´³refµ„³Headers„„´³named³body´³atom³
|
|
||||||
ByteString„„„„„„„„³HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³HostPattern„„´³named³port´³atom³
SignedInteger„„´³named³method´³refµ„³
MethodPattern„„´³named³path´³refµ„³PathPattern„„´³named³handler´³embedded´³refµ„³HttpRequest„„„„„„³HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³HttpRequest„„´³named³res´³embedded´³refµ„³HttpResponse„„„„„„³HttpRequest´³rec´³lit³http-request„´³tupleµ´³named³sequenceNumber´³atom³
SignedInteger„„´³named³host´³refµ„³RequestHost„„´³named³port´³atom³
SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³
|
|
||||||
QueryValue„„„„´³named³body´³refµ„³RequestBody„„„„„³HttpService´³rec´³lit³http-service„´³tupleµ´³named³host´³refµ„³HostPattern„„´³named³port´³atom³
SignedInteger„„´³named³method´³refµ„³
MethodPattern„„´³named³path´³refµ„³PathPattern„„„„„³PathPattern´³seqof´³refµ„³PathPatternElement„„³RequestBody´³orµµ±absent´³lit€„„µ±present´³atom³
|
|
||||||
ByteString„„„„³RequestHost´³orµµ±absent´³lit€„„µ±present´³atom³String„„„„³HttpListener´³rec´³lit³
http-listener„´³tupleµ´³named³port´³atom³
SignedInteger„„„„„³HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³
SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³
MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³embeddedType€„„µ³noise„´³schema·³version°³definitions·³Packet´³orµµ±complete´³atom³
|
|
||||||
ByteString„„µ±
|
|
||||||
fragmented´³seqof´³atom³
|
|
||||||
ByteString„„„„„³ Initiator´³rec´³lit³ initiator„´³tupleµ´³named³initiatorSession´³embedded´³refµ„³Packet„„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³
|
|
||||||
ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³
NoiseProtocol„„´³named³
preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³SessionItem´³orµµ± Initiator´³refµ„³ Initiator„„µ±Packet´³refµ„³Packet„„„„³
NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³
NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³
|
|
||||||
ByteString„„„„„µ±invalid´³dict·³ secretKey´³named³ secretKey³any„„„„µ±absent´³dict·„„„„„³DefaultProtocol´³lit±!Noise_NK_25519_ChaChaPoly_BLAKE2s„³NoiseStepDetail´³refµ„³ServiceSelector„³ServiceSelector³any³NoiseServiceSpec´³andµ´³named³base´³refµ„³ NoiseSpec„„´³named³ secretKey´³refµ„³SecretKeyField„„„„³NoisePreSharedKeys´³orµµ±present´³dict·³
preSharedKeys´³named³
preSharedKeys´³seqof´³atom³
|
|
||||||
ByteString„„„„„„µ±invalid´³dict·³
preSharedKeys´³named³
preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³timer„´³schema·³version°³definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
|
|
||||||
later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³TimerExpired´³rec´³lit³
timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³embeddedType€„„µ³trace„´³schema·³version°³definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³
|
|
||||||
break-link„´³tupleµ´³named³source´³refµ„³ActorId„„´³named³handle´³refµ³protocol„³Handle„„„„„„„„³
|
|
||||||
ExitStatus´³orµµ±ok´³lit³ok„„µ±Error´³refµ³protocol„³Error„„„„³
|
|
||||||
TraceEntry´³rec´³lit³trace„´³tupleµ´³named³ timestamp´³atom³Double„„´³named³actor´³refµ„³ActorId„„´³named³item´³refµ„³ActorActivation„„„„„³ActorActivation´³orµµ±start´³rec´³lit³start„´³tupleµ´³named³ actorName´³refµ„³Name„„„„„„µ±turn´³refµ„³TurnDescription„„µ±stop´³rec´³lit³stop„´³tupleµ´³named³status´³refµ„³
|
|
||||||
ExitStatus„„„„„„„„³FacetStopReason´³orµµ±explicitAction´³lit³explicit-action„„µ±inert´³lit³inert„„µ±parentStopping´³lit³parent-stopping„„µ±
actorStopping´³lit³actor-stopping„„„„³TurnDescription´³rec´³lit³turn„´³tupleµ´³named³id´³refµ„³TurnId„„´³named³cause´³refµ„³ TurnCause„„´³named³actions´³seqof´³refµ„³ActionDescription„„„„„„³ActionDescription´³orµµ±dequeue´³rec´³lit³dequeue„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±enqueue´³rec´³lit³enqueue„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±dequeueInternal´³rec´³lit³dequeue-internal„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±enqueueInternal´³rec´³lit³enqueue-internal„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±spawn´³rec´³lit³spawn„´³tupleµ´³named³link´³atom³Boolean„„´³named³id´³refµ„³ActorId„„„„„„µ±link´³rec´³lit³link„´³tupleµ´³named³parentActor´³refµ„³ActorId„„´³named³
childToParent´³refµ³protocol„³Handle„„´³named³
|
|
||||||
childActor´³refµ„³ActorId„„´³named³
parentToChild´³refµ³protocol„³Handle„„„„„„µ±
|
|
||||||
facetStart´³rec´³lit³facet-start„´³tupleµ´³named³path´³seqof´³refµ„³FacetId„„„„„„„µ± facetStop´³rec´³lit³
|
|
||||||
facet-stop„´³tupleµ´³named³path´³seqof´³refµ„³FacetId„„„´³named³reason´³refµ„³FacetStopReason„„„„„„µ±linkedTaskStart´³rec´³lit³linked-task-start„´³tupleµ´³named³taskName´³refµ„³Name„„´³named³id´³refµ„³TaskId„„„„„„„„³TargetedTurnEvent´³rec´³lit³event„´³tupleµ´³named³target´³refµ„³Target„„´³named³detail´³refµ„³ TurnEvent„„„„„³AssertionDescription´³orµµ±value´³rec´³lit³value„´³tupleµ´³named³value³any„„„„„µ±opaque´³rec´³lit³opaque„´³tupleµ´³named³description³any„„„„„„„³LinkedTaskReleaseReason´³orµµ± cancelled´³lit³ cancelled„„µ±normal´³lit³normal„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³stdenv„´³schema·³version°³definitions·³
StandardRoute´³orµµ±standard´³tuplePrefixµ´³named³
|
|
||||||
transports´³seqof´³refµ„³StandardTransport„„„´³named³key´³atom³
|
|
||||||
ByteString„„´³named³service³any„´³named³sig´³atom³
|
|
||||||
ByteString„„´³named³oid³any„„´³named³caveats´³seqof´³refµ³sturdy„³Caveat„„„„„µ±general´³refµ³
|
|
||||||
gatekeeper„³Route„„„„³StandardTransport´³orµµ±wsUrl´³atom³String„„µ±other³any„„„„³embeddedType€„„µ³stream„´³schema·³version°³definitions·³Mode´³orµµ±bytes´³lit³bytes„„µ±lines´³refµ„³LineMode„„µ±packet´³rec´³lit³packet„´³tupleµ´³named³size´³atom³
SignedInteger„„„„„„µ±object´³rec´³lit³object„´³tupleµ´³named³description³any„„„„„„„³Sink´³orµµ±source´³rec´³lit³source„´³tupleµ´³named³
|
|
||||||
controller´³embedded´³refµ„³Source„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±data´³rec´³lit³data„´³tupleµ´³named³payload³any„´³named³mode´³refµ„³Mode„„„„„„µ±eof´³rec´³lit³eof„´³tupleµ„„„„„„³Source´³orµµ±sink´³rec´³lit³sink„´³tupleµ´³named³
|
|
||||||
controller´³embedded´³refµ„³Sink„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±credit´³rec´³lit³credit„´³tupleµ´³named³amount´³refµ„³CreditAmount„„´³named³mode´³refµ„³Mode„„„„„„„„³LineMode´³orµµ±lf´³lit³lf„„µ±crlf´³lit³crlf„„„„³StreamError´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„„„„³CreditAmount´³orµµ±count´³atom³
SignedInteger„„µ± unbounded´³lit³ unbounded„„„„³StreamConnection´³rec´³lit³stream-connection„´³tupleµ´³named³source´³embedded´³refµ„³Source„„„´³named³sink´³embedded´³refµ„³Sink„„„´³named³spec³any„„„„³StreamListenerError´³rec´³lit³stream-listener-error„´³tupleµ´³named³spec³any„´³named³message´³atom³String„„„„„³StreamListenerReady´³rec´³lit³stream-listener-ready„´³tupleµ´³named³spec³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³sturdy„´³schema·³version°³definitions·³Lit´³rec´³lit³lit„´³tupleµ´³named³value³any„„„„³Oid´³atom³
SignedInteger„³Alts´³rec´³lit³or„´³tupleµ´³named³alternatives´³seqof´³refµ„³Rewrite„„„„„„³PAnd´³rec´³lit³and„´³tupleµ´³named³patterns´³seqof´³refµ„³Pattern„„„„„„³PNot´³rec´³lit³not„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³TRef´³rec´³lit³ref„´³tupleµ´³named³binding´³atom³
SignedInteger„„„„„³PAtom´³orµµ±Boolean´³lit³Boolean„„µ±Double´³lit³Double„„µ±
SignedInteger´³lit³
SignedInteger„„µ±String´³lit³String„„µ±
|
|
||||||
ByteString´³lit³
|
|
||||||
ByteString„„µ±Symbol´³lit³Symbol„„„„³PBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Caveat´³orµµ±Rewrite´³refµ„³Rewrite„„µ±Alts´³refµ„³Alts„„µ±Reject´³refµ„³Reject„„µ±unknown³any„„„³Reject´³rec´³lit³reject„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Pattern´³orµµ±PDiscard´³refµ„³PDiscard„„µ±PAtom´³refµ„³PAtom„„µ± PEmbedded´³refµ„³ PEmbedded„„µ±PBind´³refµ„³PBind„„µ±PAnd´³refµ„³PAnd„„µ±PNot´³refµ„³PNot„„µ±Lit´³refµ„³Lit„„µ± PCompound´³refµ„³ PCompound„„„„³Rewrite´³rec´³lit³rewrite„´³tupleµ´³named³pattern´³refµ„³Pattern„„´³named³template´³refµ„³Template„„„„„³WireRef´³orµµ±mine´³tupleµ´³lit° |