From a567bcffafc8a7010f336cb99dc64cfb7bbedda8 Mon Sep 17 00:00:00 2001
From: Andy Pack <andy@sarsoo.xyz>
Date: Sat, 15 Feb 2025 20:19:40 +0000
Subject: [PATCH] adding portfolio and asset to wasm

---
 finlib-wasm/js-local/index.js          |  6 ++++-
 finlib-wasm/js-local/package-lock.json |  2 +-
 finlib/src/lib.rs                      |  4 +++-
 finlib/src/py/mod.rs                   | 31 +-------------------------
 finlib/src/py/portfolio.rs             | 30 +++++++++++++++++++++++++
 finlib/src/wasm/mod.rs                 |  1 +
 finlib/src/wasm/portfolio.rs           | 30 +++++++++++++++++++++++++
 7 files changed, 71 insertions(+), 33 deletions(-)
 create mode 100644 finlib/src/py/portfolio.rs
 create mode 100644 finlib/src/wasm/mod.rs
 create mode 100644 finlib/src/wasm/portfolio.rs

diff --git a/finlib-wasm/js-local/index.js b/finlib-wasm/js-local/index.js
index 11fd2bd..9a0ccb5 100644
--- a/finlib-wasm/js-local/index.js
+++ b/finlib-wasm/js-local/index.js
@@ -1,4 +1,8 @@
-import { ValueAtRisk } from "finlib";
+import { ValueAtRisk, Portfolio, PortfolioAsset } from "finlib";
 
 console.log(ValueAtRisk.varcovar([1, 2, 3, 4], 0.1));
 console.log(ValueAtRisk.varcovar([1, 2, 3, 4], 0.05));
+
+let portfolio = new Portfolio([new PortfolioAsset(1.0, "test", [1.0, 2.0, 3.0])]);
+console.log(portfolio.isValid());
+console.log(portfolio.valueAtRisk(0.1));
diff --git a/finlib-wasm/js-local/package-lock.json b/finlib-wasm/js-local/package-lock.json
index eea2376..80474e3 100644
--- a/finlib-wasm/js-local/package-lock.json
+++ b/finlib-wasm/js-local/package-lock.json
@@ -20,7 +20,7 @@
       }
     },
     "../pkg": {
-      "name": "@sarsoo/finlib",
+      "name": "finlib-wasm",
       "version": "0.0.1"
     },
     "node_modules/@discoveryjs/json-ext": {
diff --git a/finlib/src/lib.rs b/finlib/src/lib.rs
index 29a08cf..02693b1 100644
--- a/finlib/src/lib.rs
+++ b/finlib/src/lib.rs
@@ -3,4 +3,6 @@ pub mod stats;
 pub mod util;
 pub mod risk;
 #[cfg(feature = "py")]
-pub mod py;
\ No newline at end of file
+pub mod py;
+#[cfg(feature = "wasm")]
+pub mod wasm;
\ No newline at end of file
diff --git a/finlib/src/py/mod.rs b/finlib/src/py/mod.rs
index 3d5ddb6..20e1ebf 100644
--- a/finlib/src/py/mod.rs
+++ b/finlib/src/py/mod.rs
@@ -1,30 +1 @@
-use pyo3::prelude::*;
-use crate::risk::portfolio::{Portfolio, PortfolioAsset};
-
-#[pymethods]
-impl Portfolio {
-
-    #[new]
-    pub fn init(assets: Vec<PortfolioAsset>) -> Self {
-        Portfolio::from(assets)
-    }
-
-    #[pyo3(name = "is_valid")]
-    pub fn is_valid_py(&self) -> bool {
-        self.is_valid()
-    }
-
-    #[pyo3(name = "value_at_risk")]
-    pub fn value_at_risk_py(&mut self, confidence: f64) -> PyResult<Option<f64>> {
-        Ok(self.value_at_risk(confidence))
-    }
-}
-
-#[pymethods]
-impl PortfolioAsset {
-
-    #[new]
-    pub fn init(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self {
-        PortfolioAsset::new(portfolio_weight, name, values)
-    }
-}
\ No newline at end of file
+pub mod portfolio;
\ No newline at end of file
diff --git a/finlib/src/py/portfolio.rs b/finlib/src/py/portfolio.rs
new file mode 100644
index 0000000..3d5ddb6
--- /dev/null
+++ b/finlib/src/py/portfolio.rs
@@ -0,0 +1,30 @@
+use pyo3::prelude::*;
+use crate::risk::portfolio::{Portfolio, PortfolioAsset};
+
+#[pymethods]
+impl Portfolio {
+
+    #[new]
+    pub fn init(assets: Vec<PortfolioAsset>) -> Self {
+        Portfolio::from(assets)
+    }
+
+    #[pyo3(name = "is_valid")]
+    pub fn is_valid_py(&self) -> bool {
+        self.is_valid()
+    }
+
+    #[pyo3(name = "value_at_risk")]
+    pub fn value_at_risk_py(&mut self, confidence: f64) -> PyResult<Option<f64>> {
+        Ok(self.value_at_risk(confidence))
+    }
+}
+
+#[pymethods]
+impl PortfolioAsset {
+
+    #[new]
+    pub fn init(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self {
+        PortfolioAsset::new(portfolio_weight, name, values)
+    }
+}
\ No newline at end of file
diff --git a/finlib/src/wasm/mod.rs b/finlib/src/wasm/mod.rs
new file mode 100644
index 0000000..20e1ebf
--- /dev/null
+++ b/finlib/src/wasm/mod.rs
@@ -0,0 +1 @@
+pub mod portfolio;
\ No newline at end of file
diff --git a/finlib/src/wasm/portfolio.rs b/finlib/src/wasm/portfolio.rs
new file mode 100644
index 0000000..91242d9
--- /dev/null
+++ b/finlib/src/wasm/portfolio.rs
@@ -0,0 +1,30 @@
+use wasm_bindgen::prelude::*;
+use crate::risk::portfolio::{Portfolio, PortfolioAsset};
+
+#[wasm_bindgen]
+impl Portfolio {
+
+    #[wasm_bindgen(constructor)]
+    pub fn init_wasm(assets: Vec<PortfolioAsset>) -> Self {
+        Portfolio::from(assets)
+    }
+
+    #[wasm_bindgen(js_name = "isValid")]
+    pub fn is_valid_wasm(&self) -> bool {
+        self.is_valid()
+    }
+
+    #[wasm_bindgen(js_name = "valueAtRisk")]
+    pub fn value_at_risk_wasm(&mut self, confidence: f64) -> Option<f64> {
+        self.value_at_risk(confidence)
+    }
+}
+
+#[wasm_bindgen]
+impl PortfolioAsset {
+
+    #[wasm_bindgen(constructor)]
+    pub fn init_wasm(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self {
+        PortfolioAsset::new(portfolio_weight, name, values)
+    }
+}
\ No newline at end of file