Commit Graph

818 Commits

Author SHA1 Message Date
Russell Cohen 7955da2e44
Add support for Streaming Response Bodies (#338)
* Assert field-by-field equality in protocol tests

Protocol tests currently use `PartialEq`, but when we add streaming members, we can no longer compare equality synchronously & without
side effects. This diff removes `PartialEq` from output shapes (we may re add it later for non-streaming shapes) & instead asserts equality of each output member in turn.

* Cleaner version of body streaming, still some work to get it to work with tests

* Finalize protocol test support

* Add default to the operation parsers

* Add helper for isStreaming on member shapes

* Cleanups & add test

* allow upper case keys in rustTemplate
2021-05-03 15:01:28 +00:00
Russell Cohen 0bef36c603
Smithy 1.7 upgrade (#340)
* Upgrade to Smithy 1.7

Two changes:
1. Add support for shape renaming. Since renaming doesn't apply to operations, errors, or resources, this was actually a fairly narrow change. I intentionally
maintained the ability to generate a model without a service shape, I expect at some point, some one will just want to make some Rust structs.
2. Add support for map-driven query params.

* Update APIGW model

* Fix bugs in httpParams implementation

* Cleanup logic and add one more test
2021-04-29 17:55:19 -04:00
Russell Cohen c36afd610e
Fix StackOverflow in SdkBody Debug (#343)
* Fix StackOverflow in SdkBody Debug

An incorrect debug implementation lead to infinite recursion when printing `SdkBody` with the debug formatter

* CR Feedback
2021-04-29 15:26:39 +00:00
Russell Cohen bc342293a1
Add ByteStream abstraction (#333)
* Add ByteStream abstraction

Introduce `ByteStream`, a wrapper around SdkBody to provide easy-to-use abstractions around streaming binary data.

* Updates for CR feedback
- `data` is renamed to `collect`
- Added `into_inner` so that you can use it as a body directly if desired
- Removed unecessary impl for io::Error
- Added `From<SdkBody> for ByteStream
- Project to remove need for `Unpin` in `Inner`
- Forward relevant method in `Buf` implementation
- Use `try_next` in example

* Fix missed `data -> Collect`

* Show don't tell in examples
2021-04-26 14:47:40 +00:00
Russell Cohen aaaf97e9bd
Sdkbody redux (#327)
* Use SdkBody instead of hyper::Body

As part of the path to supporting streaming request & response bodies, we need to remove the need to have a generic request/response body. This commit hides hyper::Body inside of SdkBody & also introduces a dynamic alternative to enable supporting any HTTP Body implementation.

* Delete ResponseBody & Update usages

Now that SDK body has a visible "Bytes" variant, ResponseBody is no longer needed as a bridge to expose debug information about responses.

* Rename _cx => cx
2021-04-22 19:46:03 -04:00
Russell Cohen e698ceae2e
Send Poll::Ready(None) on empty body (#325)
When used over H/2, sending an empty data frame for a GET can trigger some problematic behavior in Hyper. Hyper should probably handle this, but this ensures that we will
not hit this behavior.

When sending data to API Gateway services, we are getting GOAWAY because this causes to send duplicate empty data frames.
2021-04-22 15:33:13 -04:00
Russell Cohen fc0c6ea90c
Upgrade proptest to 1.0 (#310) 2021-04-14 18:08:29 -04:00
Russell Cohen ece5e147a5
Add more missing licenses (#309) 2021-04-14 16:14:19 -04:00
Russell Cohen 5055eb8e76
Add missing copyright headers (#299)
* Add missing copyright headers

* Fixes
2021-04-14 12:58:15 -04:00
Russell Cohen 336670b4c1
Create a Top-Level Error Generator (#282)
* This is weird

* impl Error for Top Level Errors

* Disable 1.51 clippy lints. Not sure why they are showing up in this PR that hasn't bumped the rustc version

* clean impl display, top level errors send/sync

* Assert errors are send+sync

* Make futures Send
2021-04-02 15:01:02 -04:00
Russell Cohen 6b605892c7
Add ApiGateway accept header customization (#287)
* Add ApiGateway accept header customization

* Update Java version in CI to match local

* Fix bug in dependency relative paths

* Add path validation
2021-04-01 17:16:13 +00:00
Russell Cohen 138320e99e
Add restJson error parsing & prefix headers support (#274)
* restJson1 Header Deserialization Support

This adds support for the `@httpHeader` trait during request deserialization. This is facilitated via a `Read` abstraction which allows parsers to consume part of an input and return the remaining input. We use this to enable things like `HttpDates` which actually include commas to be parsed in a comma delimited fashion.

The internal libraries may eventually be refactored to reduce the amount of generics if it proves to be a compiler bottleneck.

* Add support for parsing request bodies

* Add response code parsing

* Lots of refactorings to restJson response parsing

* Fix some clippy lints

* Add document deserialization support and delete the failing tests

* Add new error handling (all RestJson protocol tests passing!)

* Add prefix headers parsing support

* Fix Rust Runtime clippy warnings

* Cleanup some more dead code / clippy fixes

* Update external functions to take HeaderMap instead of the value iterator

* Hard error on unreconized binding location

* Refactor parse function generation to be on-demand

* One more round of refactoring

* Few more cleanups
2021-03-31 14:19:29 -04:00
Russell Cohen c049a37f8c
RestJson Response Parsing (#272)
* restJson1 Header Deserialization Support

This adds support for the `@httpHeader` trait during request deserialization. This is facilitated via a `Read` abstraction which allows parsers to consume part of an input and return the remaining input. We use this to enable things like `HttpDates` which actually include commas to be parsed in a comma delimited fashion.

The internal libraries may eventually be refactored to reduce the amount of generics if it proves to be a compiler bottleneck.

* Add support for parsing request bodies

* Add response code parsing

* Lots of refactorings to restJson response parsing

* Fix some clippy lints

* Add document deserialization support and delete the failing tests
2021-03-29 19:03:26 -04:00
Russell Cohen b67e651f22
Add support for document deserialization (#273) 2021-03-25 19:55:23 -04:00
Russell Cohen 16b71cf9fe
Http Prefix Header Support (#263)
* Http Prefix Header Support

The impetus of this diff is adding support for HttpPrefix headers. This ended up leading to a bunch of other changes:

1. operation.build() now always returns a result to account for inability to construct HTTP requests from certain inputs
2. HeaderName/HeaderValue is now created eagerly to give a better error message
3. httpPrefixHeaders are supported
4. The Dynamo movies example now uses the fluent client.

* Disable clippy lint of extra wrap

* Fix example

* Delete some dead code
2021-03-24 15:45:42 -04:00
Russell Cohen 41d948c597
Serialize Request bodies for restJson (#255)
* Serialize Request Bodies for RestJson

* Move the bodies to the serializer module

* RestJson body CR feedback and bug fixes
2021-03-22 16:40:50 -04:00
Russell Cohen 4f958f3709
Add support for query literals (#257)
* Add support for query literals

* Add comments

* Refactor to avoid needing a Vec and skip some allocations

* Another rename, more docs
2021-03-22 15:19:36 -04:00
Russell Cohen 90f116c501
Refactor errors to expose a kind & meta field separately (#249)
* Refactor errors to expose a kind & meta field separately

* More simplification of errors

* Simplify the retryable_error_kind implementation

* Error generator cleanups

* Fix aws-hyper feature issue

* Small test-util refactoring to improve debug output
2021-03-16 15:11:24 -04:00
Russell Cohen 8b386a8868
No more unpin (#248)
* Remove unecessary Unpin bound

* Cargo Fmt
2021-03-10 23:46:37 +00:00
Russell Cohen 6b38bf718e
Concrete body in SdkResult/SdkError (#247)
* Refactor out generic `B` parameter from SdkResult / SdkError

* Switch to from_static

* Add docs, fix old broken docs

* Remove unused From<Bytes> bound

* Rustfmt run
2021-03-10 23:28:05 +00:00
Russell Cohen 9959d9b97e
Introduce a `Standard` enum for connections (#237)
* Enum Conn POC

* Make alias public

* Add docs, Debug impl, format

* Add comment delete dead code

* A couple of missing cargo-formats

* Cleanup, address CR feedback

* Derive clone instead of implementing it manually
2021-03-08 18:02:48 -05:00
Russell Cohen f192530f4d
Pseudo-Integration tests for KMS (#239)
* wip

* Generate Cargo.toml after lib rs, cleanup deps

* Move RecordingConnection into an extras crate

* Move generation code into extras crate

* Delete unused conn method

* Add todo about storing req/resps externally

* Add note about credential expiry

* Fix clippy lint

* Replace creds with fake creds

* Delete note about real credentials

* Give cargo fmt a hand
2021-03-05 12:24:37 -05:00
Russell Cohen 77b24b2c3b
Cleanups (#236)
* EndpointResolver should be pub(crate)

* Switch internals of Region to be Cow

* Rename ProvideIdempotencyToken to MakeIdempotenyToken

* Make the config module public and rename ConfigBuilder to Builder

* Rename credentials to

* Fix missed use of Endpoint
2021-03-03 15:54:20 -05:00
Russell Cohen 638b2a90de
Upgrade to Smithy 1.6.1 (#235) 2021-03-03 14:08:03 -05:00
Russell Cohen 970f69bf06
Create a table in the example (#226) 2021-03-03 11:35:41 -05:00
Russell Cohen 8f844c579c
Add Retry support (#232)
* Add Retry support

* Fixup some broken tests

* Refactor, add docs, rename retry strategy

* Some more renames, some more docs
2021-03-02 22:32:55 +00:00
Russell Cohen c7fba4d03f
Add support for ErrorKind and RetryKind to all error models (#180)
* Modeling Structured Retries

* Improvements to docs

Co-authored-by: David Barsky <dbarsky@amazon.com>

* Improve RetryKind documentation

* Remove println, add .

* Rename to classify

* Add RetryPolicy test

* Fix clippy errors

* Remove unused paramaterization of AwsRetryPolicy

* Add missing retry module

* Cut down on generated code

* Fix tests

* Rename error_kind to retryable_error_kind

* Fix tests

Co-authored-by: David Barsky <dbarsky@amazon.com>
2021-02-23 15:23:56 -05:00
Russell Cohen bbe1f0a95c
Add tracing events to parse_response (#228)
* Add tracing events to parse_response

* Fix test
2021-02-22 19:35:58 -05:00
Russell Cohen 71c97a1335
Ergonomics improvements & a working example (#204)
* Ergonomics improvements & a working example

This diff adds several `pub use` statements to generated service crates to improve ergonomics, namely, this removes the need for customers to depend on internal crates like `aws-auth` when using the SDK. A few other minor bugs were also fixed on the path to getting a working example.

* Fix broken intra doc link

* Fix stale import

* Remove dead code
2021-02-17 13:45:40 +00:00
Russell Cohen b60b30bba6
Initial implementation of aws-hyper (#201)
* Initial implementation of aws-hyper

Although this is expected to evolve, this initial implementation of aws-hyper supports endpoint, signing & response parsing middleware and is sufficient to drive basic AWS services.

A `TestConnection` helper is also provided. This enables end-to-end testing of clients by mocking out the connection with a vector of request/response pairs.

* Update test

* Add more docs, rename default to https

* Add rt tokio feature

* Fix hyper features
2021-02-16 13:32:32 -05:00
Russell Cohen 27e00dd08f
SigV4 Signing Middleware (#193)
* wip

* Add SigV4 Signing Middleware

Utilizing `MapRequest` and the `Credentials` machinery, this diff adds SigV4SigningStage, a middleware stage that can sign `SigV4Requests`.

The signing behavior is driven by several fields that may be present in the property bag.
2021-02-12 20:26:30 -05:00
Russell Cohen 5b4515c418
Implement Tower Shims for SDK middleware (#187)
* Implement Tower Shims for SDK middleware

This commit implements 3 pieces of tower middleware:
1. A tower service supporting smithy_http::middleware::MapRequest
2. A tower service to dispatch operation::Request
3. A tower service to dispatch & parse the results of `operation::Operation`

* Fix clippy lints

* Go back to default debug implementation

* Check docs in rust-runtime test script

* Make Dispatch layer non-exhaustive

* Derive default for DispatchLayer
2021-02-12 12:14:43 -05:00
Russell Cohen cb50262c93
Add CredentialsProvider to config (and related refactorings) (#182)
* Add credentials provider config & test

* Prepare to use `Features` during Operation Generation

* Fix sdk gradle build changes that were previously missed

* Utilize the credentials provider in the feature

* Update IdempotencyTokenProvider to be Send + Sync

* Add accessors for credential providers

* Fix build.gradle

* Update auth references to be aws-auth

* Update idempotency token test
2021-02-11 10:48:53 -05:00
Russell Cohen 38f2b29006
AWS Endpoint Middleware (#188)
* AWS Endpoint Middleware

This commit builds on the work of previous `Endpoint` work to incorporate AWS-specific endpoint abstractions.

* Delete dead code, add more docs

* CR Feedback: Rename Provide to Resolve
2021-02-10 07:50:07 -05:00
Russell Cohen 6da99699bb
Implement core Smithy endpoint support (#183)
* Implement core Smithy endpoint support

This commit adds `Endpoint` to smithy-http & records our design decisions in `endpoint.md`. This provides support for the endpoint trait in Smithy. A design for endpoint discovery is proposed but is not currently implemented.

* Apply suggestions from code review

Co-authored-by: Lucio Franco <luciofranco14@gmail.com>

* More cleanups

Co-authored-by: Lucio Franco <luciofranco14@gmail.com>
2021-02-08 10:16:16 -05:00
Russell Cohen 86fc5f25c9
Add middleware & update design docs (#175)
* Add middleware & update design docs

* Add missing design folder

* Improve MapRequest middleware example

* Vendor pin_utils::pin_mut

* Remove Debug body restrictions

* Modify error bound

* Remove redundant return
2021-02-02 12:42:15 -05:00
Russell Cohen ed7454ff0d
Generate smithy_http::Operation & Implement ParseResponse trait (#174)
* Generate smithy_http::Operation

* Implement ParseResponse trait for AwsJson services
2021-01-29 11:56:57 -05:00
Russell Cohen 61dadaeb01
Credentials Provider Initial Implementation (#179) 2021-01-28 10:39:05 -05:00
Russell Cohen ec0b06d1ad
Top level error shape improvements (#172)
* Fallback to a generic error representation for unmodeled errors

* DRY out some dependencies

* Fix name is instant_iso8601 resource

* Top level error shape improvements

This commit adds `code` and `message` as inherent methods to top level error shapes (eg. `ListTablesError`). If the error is unmodeled, it uses
downcasting to extract a message.

* Fix clippy warning
2021-01-27 20:07:34 -05:00
Russell Cohen c9659093d4
Fallback to a generic error representation for unmodeled errors (#171)
* Fallback to a generic error representation for unmodeled errors

* DRY out some dependencies

* Fix name is instant_iso8601 resource
2021-01-27 18:14:42 -05:00
Russell Cohen 2ff12e6ac9
Http Operation traits and structures (#167)
* Http Operation traits and structures

Initial implementation of `Operation` for HTTP based services and `ParseHttpResponse`. I'm also starting to collect design documentation in `design`, an mdBook intended to serve as a repository for public facing design documentation.

* Update rust-runtime/smithy-http/src/body.rs

Co-authored-by: Jonathan Esterhazy <jonathan.esterhazy@gmail.com>

* Add retry policy

* Fix doctest failures

* Update rust-runtime/smithy-http/src/operation.rs

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update rust-runtime/smithy-http/src/operation.rs

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update design/src/operation.md

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update design/src/operation.md

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update rust-runtime/smithy-http/src/response.rs

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update design/src/operation.md

Co-authored-by: Kerem Kat <keremkat@gmail.com>

* Update design/src/operation.md

Co-authored-by: Kerem Kat <keremkat@gmail.com>

Co-authored-by: Jonathan Esterhazy <jonathan.esterhazy@gmail.com>
Co-authored-by: Kerem Kat <keremkat@gmail.com>
2021-01-25 08:56:55 -05:00
Russell Cohen 25deed8d9a
Remove all hand-written serializers (#100)
* Support Deserializing Boxes and HashMaps

* Extract SerializerBuilder to its own file & add some more comments

* Rename to CustomSerializerGenerator

* CR updates

* Add comment for container interface

* Update the comments with example generated code
2021-01-01 08:32:36 -05:00
Russell Cohen c819930d0f
[chore] Upgrade to Rust 1.49.0 (#99) 2020-12-31 16:09:58 -05:00
Russell Cohen 56e9d9d528
Customization Abstractions & Config Generation (#96)
* Customization Abstractions & Config Generation

A previous PR supported idempotency tokens with a hardcoded config implementation. This commit replaces it with the "real thing,"
supported by the `NamedSectionGenerator` abstraction. The intention idea is that sections can be typesafe, well documented, and evolve as compile
errors instead of silent failures.

Sections can also bring along state / generation context to allow for situation-specific customization. This API is still very experimental
and is expected to evolve as we continue to generate a fully customized DynamoDB client.

HttpProtocolGeneratorTest & integration tests provide complete test coverage—a unit test was also added to allow quicker iterations when adding customizations.

* Use typealias

* Fix missed merge conflicts, rename to member
2020-12-30 10:34:29 -05:00
Russell Cohen 02d0db5d29
Generate deserializers dynamically for nested types (#95)
This code replaces the hand-written deserializers that were used to serialize types like Instant & Blob with autogenerated code. A follow-on diff will do the same thing for serializers.

Once sufficiently developed (and if desired) this would allow us to completely remove our use of Serde-derived serializers with serializers & deserializers generated at codegen time.
2020-12-30 10:07:49 -05:00
Russell Cohen e2c766b11b
Add support for parsing IS08601 dates (#94) 2020-12-22 12:56:57 -05:00
Russell Cohen b6b75a7fe3
Support Deserializing Http Dates (#86)
* Support Deserializing Http Dates

Deserializing HTTP dates is made slightly more complex because Smithy actually supports a format _not_ outlined by the RFC where the HTTP date
uses fractional seconds. For this reason (as well as dropping the chrono dependency in the future), `httpdate` was forked and incorporated into smithy-types. At a later date, we _may_ consider inlining this dependency into the crates that actually need it.

As a side change, I'm starting to refactor the way that custom serialization works via new-types. This enables generating composable serializers
that are much easier to autogenerate.
2020-12-22 11:00:41 -05:00
Russell Cohen e79ccb1422
Support Idempotency Token (#91)
This commit adds support for the idempotency token trait via a config. I'm not ready to build a generalized Config generator yet, so intead I'm injecting a static config via inlinable. A follow up diff will flesh out ServiceConfigGenerator to support adding more config sections as required by AWS.
2020-12-18 12:45:31 -05:00
Russell Cohen c0aa43c614
Update copyrights on every file (#89) 2020-12-17 13:45:48 -05:00
Russell Cohen c76113675a
Dynamo IT & IO Layer v0 (#84)
* Dynamo IT & IO Layer v0

This diff adds 2 _extremely_ WIP components:
1. A basic IO layer that uses Hyper and a pure Rust signer. This will change significantly over the coming days.
2. A rudimentary Dynamo DB integration test that creates a table and verifies that it exists.

Neither of these is anywhere near final, but, rather, these are intended as a starting point for discussion.

* Fixup tests
2020-12-14 23:24:47 -05:00
Russell Cohen fe6a56fc1d
Deserialize responses (#81)
* Deserialize responses

* Fix http version

* Fix test failures after merge
2020-12-11 20:44:50 -05:00
Russell Cohen a3d5f10e60
Add support for serializing document types (#75)
* Add support for serializing document types

* Delete unused conversion function

* Add test for NaN behavior

* Fix test flakiness
2020-12-11 17:21:45 -05:00
Russell Cohen 48b4ef6a32
Generated Combined Error Shapes (#71)
* Add combined error generator

* Deterministic operation generation

* Test generator refactoring

* Fix test failure in inlineable

* Back out needless changes to Rust.kt and merge error types

* Add some docs
2020-12-07 16:56:30 -05:00
Russell Cohen efdca4484c
Add uuidv4 implementation & rust-runtime as JAR (#55)
* Add uuidv4 implementation & rust-runtime as JAR

* Add inlineable crate

* Flesh out dependency test
2020-11-25 18:49:38 -05:00
Russell Cohen 9609cc3a58
Support the remaining fields on request protocol tests (#50)
* Support the remaining fields on request protocol tests

Add support for remaining requirements and & make some small changes to support them.

* Satisfy rustfmt
2020-11-23 14:32:15 -05:00
Russell Cohen 2f2a9517d0
Support Serialization via Serde Annotations (#40)
* Refactor SymbolMetadataProvider into an abstract class

* Refactor meta to expectMeta

* Refactor SymbolMetadataProvider into an abstract class

* Refactor meta to expectMeta

* Add support for inline dependencies

* Implement Json Serializers!

* CR fixes
2020-11-20 15:41:45 -05:00
Russell Cohen 16e513bd5d
Pin Rust version & fix lint error (#41)
Every 6 weeks, a new version of Rust and Clippy comes out—we were upgrading implicitly which meant that our clippy (lint) checks started failing if they added new lints. This makes the Rust version explicit so we can upgrade and fix lints on our schedule.
2020-11-19 13:58:38 -05:00
Russell Cohen 555021e36b
Expand protocol tests for RestJson1.1 and AwsRestJson (#38)
* Add document types & other bug fixes to support AwsJson11

* Expand protocol tests for RestJson1.1 and AwsRestJson

This diff adds RestJson1 and AwsJson1.1 to the integration test suite. It uncovered a number of bugs, some of which I fixed inline and some I filed issues for and disabled the tests.

* Add another disabled test & cleaup

* Fix tests broken by changing URL encoding to encode ':'

* Copy-paste Aarons comment

* Fixup Rustfmt
2020-11-18 15:13:12 -05:00
Russell Cohen 31cfbf573c
Fix blob instantiation code for protocol tests (#24)
* Fix blob instantiation code for protocol tests

* Update Instantiator.kt

clarify comment
2020-11-13 21:01:15 -05:00
Russell Cohen c7d4c0316e
Add Body Validation Support to Protocol Test Helpers (#21)
* Use thiserror to make prettier errors

* Add body validation support

* Fixes for clippy
2020-11-12 13:55:48 -05:00
Russell Cohen 9707c0347a
Increase scope of Protocol test generation (#18)
* Setup pre-commit

* Run precommit hook across all files

* Increase scope of Protocol test generaton

Added support for the following fields in protocol tests:
- forbidQueryParams
- requireQueryParams
- headers
2020-11-04 22:20:50 -05:00
Russell Cohen 86dc5db504
Add pre-commit hooks (#17)
* Setup pre-commit

* Run precommit hook across all files

* Update README.md
2020-11-04 22:09:00 -05:00
Russell Cohen 1d30ad06ca
Add initial protocol test generation (#16)
* Implement Instantiator

* Add support for dev-dependencies

* Pass the protocol in Protocol config

* Add initial protocol test generator

This commit adds an initial and very limited implementation of protocol test generation. Specifically,
it only asserts that the query string contains certain required parameters. We will update protocol test generation in concert with updates to the code generation features.

* Fixes from integration tests

* Add test of recursive maps, fix implementation of empty maps

* Add protocol test generator, pre-commit hooks

* Fix test

* Fix formatting
2020-11-04 11:17:19 -05:00
Russell Cohen 9983057a4b
Add inital CI workflow (#12)
* Add inital CI workflow

* Run unit tests

* Run integration tests & ktlint

* Split job, set REPO_ROOT

* Update to satisfy new cargo clippy

* Upload an artifact

* Run runtime tests in CI

* Add missing test.sh

* Make script path indepdendent

* Run clippy on Rust runtime

* move artifact upload to the correct job

* Don't upload target

* Fix Rust code formatting

* Fix kotlin codestyle

* Fix merge issue
2020-11-02 15:30:04 -05:00
Russell Cohen 4557f6a6bb
Add protocol test helpers (#11)
* Add protocol test helpers

* expand tests
2020-11-02 14:03:21 -05:00
Russell Cohen 972d833c28
Add base64::decode & property testing (#4)
To support protocol tests, this commit adds `decode` to our base64 implementation. The implementation is validated against the base64 crate and stress-tested with proptest for correctness and crash-free-ness.
2020-11-02 12:27:35 -05:00
Russell Cohen ddac680d53
Partial HTTP protocol implementation (#1)
* Add new models to run integration tests against

* Add initial support for HTTP protocols

* Refactor protocol generation arguments

* Add more method comments

* Remove some dead code

* CR feedback
2020-10-29 15:49:22 -04:00
Russell Cohen 4874168a9b Add Rust runtime code 2020-10-28 11:08:23 -04:00