qstart | ||
.gitignore | ||
LICENSE | ||
README.org |
Rust Quickstart
- Org shortcuts
- Instaling Rust
- Install Spin
- Install Templates for Rust
- Installing Wasm
- Create the first application
- Modifying the code
- Building the app
- Running the app
- Try the app
#+date:[2023-11-19 Sun]
Org shortcuts
Feetnotes1
- create footnote
C-c C-x f
- jump to the footnote ref
C-c C-c
Instaling Rust
Looking at the get-started doc,
let's use rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Checking if the install went ok
rustup --version
rustup upgrade
rustup 1.26.0 (5af9b9484 2023-04-05) info: This is the version for the rustup toolchain manager, not the rustc compiler. info: The currently active `rustc` version is `rustc 1.74.0 (79e9716c9 2023-11-13)` info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu' info: checking for self-update stable-x86_64-unknown-linux-gnu unchanged - rustc 1.74.0 (79e9716c9 2023-11-13) info: cleaning up downloads & tmp directories
Ensure cargo, the package manager is also installed
cargo --version
cargo 1.74.0 (ecb9851af 2023-10-18)
Rust mode for emacs
Install Spin
This has been done already in a previous tut.
spin -V
spin 2.0.1 (1d72f1c 2023-11-10)
Install Templates for Rust
This has also been done in a previous tut.
spin template list
+------------------------------------------------------------------------+ | Name Description | +========================================================================+ | http-c HTTP request handler using C and the Zig toolchain | | http-empty HTTP application with no components | | http-go HTTP request handler using (Tiny)Go | | http-grain HTTP request handler using Grain | | http-js HTTP request handler using Javascript | | http-php HTTP request handler using PHP | | http-rust HTTP request handler using Rust | | http-swift HTTP request handler using SwiftWasm | | http-ts HTTP request handler using Typescript | | http-zig HTTP request handler using Zig | | redirect Redirects a HTTP route | | redis-go Redis message handler using (Tiny)Go | | redis-rust Redis message handler using Rust | | static-fileserver Serves static files from an asset directory | +------------------------------------------------------------------------+
Installing Wasm
We need additional tools to support Wasm.
rustup target add wasm32-wasi
info: downloading component 'rust-std' for 'wasm32-wasi' info: installing component 'rust-std' for 'wasm32-wasi' 17.7 MiB / 17.7 MiB (100 %) 13.8 MiB/s in 1s ETA: 0s
Create the first application
We use spin new
and select the rust template http-rust
spin new -t http-rust qstart
Description []: a quick hello world Description: a quick hello world HTTP path [/...]: HTTP path: /...
tree qstart/
qstart/ ├── Cargo.toml ├── spin.toml └── src └── lib.rs 2 directories, 3 files
The manifest file is spin.toml
spin_manifest_version = 2
[application]
name = "qstart"
version = "0.1.0"
authors = ["HaQadosch <redacted>"]
description = "a quick hello world"
[[trigger.http]]
route = "/..."
component = "qstart"
[component.qstart]
source = "target/wasm32-wasi/release/qstart.wasm"
allowed_outbound_hosts = []
[component.qstart.build]
command = "cargo build --target wasm32-wasi --release"
watch = ["src/**/*.rs", "Cargo.toml"]
Modifying the code
We change the qstar/lib.rs
file to display the hello world
message.
git diff
diff --git a/qstart/src/lib.rs b/qstart/src/lib.rs index f3051ef..a51e027 100644 --- a/qstart/src/lib.rs +++ b/qstart/src/lib.rs @@ -8,5 +8,5 @@ fn handle_qstart(req: Request) -> anyhow::Result<impl IntoResponse> { Ok(http::Response::builder() .status(200) .header("content-type", "text/plain") - .body("Hello, Fermyon")?) + .body("Hello, World!")?) }
Building the app
In the qstart/
folder
cd qstart/
spin build
Building component qstart with `cargo build --target wasm32-wasi --release` Finished release [optimized] target(s) in 0.17s Finished building all Spin components
Running the app
We could have done spin build --up
to autostart the app once the build has
been done.
cd qstart/
spin up
Logging component stdio to ".spin/logs/" Serving http://127.0.0.1:3000 Available Routes: qstart: http://127.0.0.1:3000 (wildcard) 2023-11-19T18:38:54.648503Z ERROR spin_trigger::cli: Trigger executor failed Error: Unable to listen on 127.0.0.1:3000 Caused by: Address already in use (os error 98)
In this case we have another app running in the same port. Let's see which one.
lsof -i tcp:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME forgejo 1531870 haqadosch 7u IPv6 8599019 0t0 TCP *:3000 (LISTEN)
So we kill that one and restart the spin up
.
kill -9 1531870
cd qstart/
spin up
Logging component stdio to ".spin/logs/" Serving http://127.0.0.1:3000 Available Routes: qstart: http://127.0.0.1:3000 (wildcard)
Try the app
We can display the page in your favourite browser or confirm with curl
curl -i localhost:3000
HTTP/1.1 200 OK content-type: text/plain transfer-encoding: chunked date: Sun, 19 Nov 2023 19:01:02 GMT Hello, World!