From e74c266a6eda30eff03ddc8b781c3b8d3cf4ae73 Mon Sep 17 00:00:00 2001
From: Andy Pack <andy@sarsoo.xyz>
Date: Mon, 17 Feb 2025 23:22:35 +0000
Subject: [PATCH] tweaking ffi bindings, bumping version

---
 .gitea/workflows/build.yml             |  2 +-
 Cargo.lock                             |  8 +++---
 Cargo.toml                             |  2 +-
 FinLib.NET/FinLib/FinLib.Interest.cs   |  5 +---
 FinLib.NET/FinLib/FinLib.Risk.cs       |  2 ++
 FinLib.NET/FinLib/FinLib.csproj        | 12 ++++----
 FinLib.NET/FinLib/NativeMethods.g.cs   | 39 ++++++++++++++++++++++++++
 finlib-cpp/include/finlib-native.h     |  2 ++
 finlib-ffi/build.rs                    | 11 ++++++++
 finlib-ffi/cbindgen.toml               |  8 +++---
 finlib-ffi/src/lib.rs                  |  6 ++++
 finlib/src/options/blackscholes/mod.rs | 10 +++----
 12 files changed, 82 insertions(+), 25 deletions(-)

diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml
index 0aa4d26..6913d7c 100644
--- a/.gitea/workflows/build.yml
+++ b/.gitea/workflows/build.yml
@@ -131,7 +131,7 @@ jobs:
 
       - name: Push
         working-directory: ./FinLib.NET/FinLib
-        run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.3.nupkg
+        run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.4.nupkg
 
   buildWASM:
     name: Build WASM
diff --git a/Cargo.lock b/Cargo.lock
index 08b4261..265f179 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -259,7 +259,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
 
 [[package]]
 name = "finlib"
-version = "0.0.3"
+version = "0.0.4"
 dependencies = [
  "getrandom 0.2.15",
  "log",
@@ -274,7 +274,7 @@ dependencies = [
 
 [[package]]
 name = "finlib-ffi"
-version = "0.0.3"
+version = "0.0.4"
 dependencies = [
  "cbindgen",
  "csbindgen",
@@ -283,7 +283,7 @@ dependencies = [
 
 [[package]]
 name = "finlib-wasm"
-version = "0.0.3"
+version = "0.0.4"
 dependencies = [
  "console_error_panic_hook",
  "console_log",
@@ -606,7 +606,7 @@ dependencies = [
 
 [[package]]
 name = "pyfinlib"
-version = "0.0.3"
+version = "0.0.4"
 dependencies = [
  "finlib",
  "log",
diff --git a/Cargo.toml b/Cargo.toml
index 5c81626..2383a13 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,7 @@ default-members = [
 ]
 
 [workspace.package]
-version = "0.0.3"
+version = "0.0.4"
 authors = ["sarsoo <andy@sarsoo.xyz>"]
 description = "Quant finance functions implemented in Rust"
 edition = "2021"
diff --git a/FinLib.NET/FinLib/FinLib.Interest.cs b/FinLib.NET/FinLib/FinLib.Interest.cs
index a6bba3f..efa04ef 100644
--- a/FinLib.NET/FinLib/FinLib.Interest.cs
+++ b/FinLib.NET/FinLib/FinLib.Interest.cs
@@ -7,8 +7,5 @@ namespace FinLib.Interest;
 
 public static class Interest
 {
-    public static double Compound(double principal, double rate, double time, double n)
-    {
-        return NativeMethods.interest_compound(principal, rate, time, n);
-    }
+    public static double Compound(double principal, double rate, double time, double n) => NativeMethods.interest_compound(principal, rate, time, n);
 }
\ No newline at end of file
diff --git a/FinLib.NET/FinLib/FinLib.Risk.cs b/FinLib.NET/FinLib/FinLib.Risk.cs
index 7813bdb..bba9bee 100644
--- a/FinLib.NET/FinLib/FinLib.Risk.cs
+++ b/FinLib.NET/FinLib/FinLib.Risk.cs
@@ -30,4 +30,6 @@ public static class ValueAtRisk
             }
         }
     }
+
+    public static double ScaleValueAtRisk(double initialValue, nint timeCycles) => NativeMethods.scale_value_at_risk(initialValue, timeCycles);
 }
\ No newline at end of file
diff --git a/FinLib.NET/FinLib/FinLib.csproj b/FinLib.NET/FinLib/FinLib.csproj
index 28d7541..f2b69d9 100644
--- a/FinLib.NET/FinLib/FinLib.csproj
+++ b/FinLib.NET/FinLib/FinLib.csproj
@@ -1,17 +1,17 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
+  <PropertyGroup>
+    <PackageId>FinLib.NET</PackageId>
+    <Version>0.0.4</Version>
+    <Authors>sarsoo</Authors>
+  </PropertyGroup>
+
   <PropertyGroup>
     <TargetFrameworks>netstandard2.0</TargetFrameworks>
     <LangVersion>latest</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
-  <PropertyGroup>
-    <PackageId>FinLib.NET</PackageId>
-    <Version>0.0.1</Version>
-    <Authors>sarsoo</Authors>
-  </PropertyGroup>
-
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
     <Content Include="..\..\target\debug\libfinlib_ffi.*">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
diff --git a/FinLib.NET/FinLib/NativeMethods.g.cs b/FinLib.NET/FinLib/NativeMethods.g.cs
index 1d1065f..fcbb16b 100644
--- a/FinLib.NET/FinLib/NativeMethods.g.cs
+++ b/FinLib.NET/FinLib/NativeMethods.g.cs
@@ -28,9 +28,48 @@ namespace FinLib
         [DllImport(__DllName, EntryPoint = "varcovar_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
         internal static extern double* varcovar_value_at_risk(double* arr, nuint len, double confidence);
 
+        [DllImport(__DllName, EntryPoint = "scale_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
+        internal static extern double scale_value_at_risk(double initial_value, nint time_cycles);
+
 
     }
 
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct Portfolio
+    {
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct PortfolioAsset
+    {
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct OptionVariables
+    {
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct CallOption
+    {
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct PutOption
+    {
+    }
+
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe partial struct OptionGreeks
+    {
+    }
+
+
+    internal enum ValueType : byte
+    {
+        Absolute,
+        RateOfChange,
+    }
 
 
 }
diff --git a/finlib-cpp/include/finlib-native.h b/finlib-cpp/include/finlib-native.h
index 1dd2773..dea90d7 100644
--- a/finlib-cpp/include/finlib-native.h
+++ b/finlib-cpp/include/finlib-native.h
@@ -23,6 +23,8 @@ const double *historical_value_at_risk(const double *arr, size_t len, double con
 
 double interest_compound(double principal, double rate, double time, double n);
 
+double scale_value_at_risk(double initial_value, ptrdiff_t time_cycles);
+
 const double *varcovar_value_at_risk(const double *arr, size_t len, double confidence);
 
 }  // extern "C"
diff --git a/finlib-ffi/build.rs b/finlib-ffi/build.rs
index 4f30ff9..08e65f4 100644
--- a/finlib-ffi/build.rs
+++ b/finlib-ffi/build.rs
@@ -19,7 +19,18 @@ fn main() {
     csbindgen::Builder::default()
         .input_extern_file("src/lib.rs")
         .input_extern_file("../finlib/src/lib.rs")
+        .input_extern_file("../finlib/src/risk/portfolio.rs")
+        .input_extern_file("../finlib/src/options/blackscholes/mod.rs")
         .csharp_dll_name("libfinlib_ffi")
+        .always_included_types([
+            "Portfolio",
+            "ValueType",
+            "PortfolioAsset",
+            "OptionVariables",
+            "CallOption",
+            "PutOption",
+            "OptionGreeks",
+        ])
         .csharp_namespace("FinLib")
         .generate_csharp_file("../FinLib.NET/FinLib/NativeMethods.g.cs")
         .unwrap();
diff --git a/finlib-ffi/cbindgen.toml b/finlib-ffi/cbindgen.toml
index cd8eb52..dc8e222 100644
--- a/finlib-ffi/cbindgen.toml
+++ b/finlib-ffi/cbindgen.toml
@@ -144,11 +144,11 @@ bitflags = false
 ############## Options for How Your Rust library Should Be Parsed ##############
 
 [parse]
-parse_deps = false
-# include = []
-exclude = []
+parse_deps = true
+include = ["finlib"]
+#exclude = []
 clean = false
-extra_bindings = []
+extra_bindings = ["finlib"]
 
 
 
diff --git a/finlib-ffi/src/lib.rs b/finlib-ffi/src/lib.rs
index ddf2a73..a52cbcf 100644
--- a/finlib-ffi/src/lib.rs
+++ b/finlib-ffi/src/lib.rs
@@ -44,3 +44,9 @@ pub unsafe extern "C" fn varcovar_value_at_risk(arr: *const f64, len: usize, con
 
     Box::into_raw(Box::new(finlib::risk::var::varcovar::value_at_risk_percent(input_array, confidence)))
 }
+
+#[no_mangle]
+pub unsafe extern "C" fn scale_value_at_risk(initial_value: f64, time_cycles: isize) -> f64 {
+
+    finlib::risk::var::varcovar::scale_value_at_risk(initial_value, time_cycles)
+}
diff --git a/finlib/src/options/blackscholes/mod.rs b/finlib/src/options/blackscholes/mod.rs
index 7235352..b162007 100644
--- a/finlib/src/options/blackscholes/mod.rs
+++ b/finlib/src/options/blackscholes/mod.rs
@@ -255,11 +255,11 @@ pub fn vega(v: &OptionVariables) -> f64 {
 #[cfg_attr(feature = "ffi", repr(C))]
 #[derive(Debug, Copy, Clone, Default, PartialEq, PartialOrd)]
 pub struct OptionGreeks {
-    delta: f64,
-    gamma: f64,
-    vega: f64,
-    theta: f64,
-    rho: f64
+    pub delta: f64,
+    pub gamma: f64,
+    pub vega: f64,
+    pub theta: f64,
+    pub rho: f64
 }
 
 impl OptionGreeks {