Go to file
2023-11-19 19:05:08 +00:00
qstart build and spin the app 2023-11-19 19:05:08 +00:00
.gitignore install rustup 2023-11-19 17:25:30 +00:00
LICENSE Initial commit 2023-11-19 17:46:03 +01:00
README.org build and spin the app 2023-11-19 19:05:08 +00:00

Rust Quickstart

#+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!