Skip to content

Fibonacci - Spin App

spin.toml

spin_version = "1"
authors = ["MikeTeddyOmondi <mike_omondi@outlook.com>"]
description = ""
name = "fibonacci-spin-app"
trigger = { type = "http", base = "/" }
version = "0.1.0"

[[component]]
id = "fibonacci-spin-app"
source = "target/wasm32-wasi/release/fibonacci_spin_app.wasm"
key_value_stores = ["default"]
[component.trigger]
route = "/..."
[component.build]
command = "cargo build --target wasm32-wasi --release"

src/lib.rs

use anyhow::Result;
use spin_sdk::{
    http::{Request, Response},
    http_component,
    key_value::{Error, Store},
};
use serde::{Serialize, Deserialize};
use serde_json::{from_slice, json, to_string, to_vec};

#[derive(Debug, Serialize, Deserialize)]
struct ReqBody {
    number: i64
}

fn fibonacci(n: i64) -> usize {
    if n == 0 {
        return 0;
    } else if n == 1 {
        return 1;
    }

    let mut prev_prev: usize = 0;
    let mut prev: usize = 1;
    let mut curr: usize;

    for _ in 2..=n {
        curr = prev + prev_prev;
        prev_prev = prev;
        prev = curr;
    }

    return prev;
}

/// A simple Spin HTTP component.
#[http_component]
fn fibonacci_spin_app(req: Request) -> Result<Response> {
    let store = Store::open_default()?;

    println!("headers: {:#?}", req.headers());

    let value = req.body(); //.unwrap();

    let v = match value {
        Some(v) => v,
        None => todo!()
    };
    // println!("v: {:#?}", v);

    let request_body: ReqBody = from_slice(&v).unwrap();
    println!("req_body: {:#?}", request_body);

    let ReqBody { number } = request_body;
    let result = fibonacci(number);

    // let response_body = format!("The fibonacci of number {} is {}", number, result);
    let response_body = json!({"result": result});
    let response_body = to_string(&response_body)?;

    store.set("fibonacci_result".to_string(), to_vec(&response_body).unwrap())?;

    // let stored_value = store.get("fibonacci_result".to_string()).unwrap();
    // println!("{:#?}", from_slice::<ReqBody>(&stored_value));

    Ok(http::Response::builder()
        .status(200)
        .header("foo", "bar")
        .body(Some(response_body.into()))?)
}