diff --git a/exe/Main.hs b/exe/Main.hs index 1fb2f8d..04cc6c5 100644 --- a/exe/Main.hs +++ b/exe/Main.hs @@ -9,6 +9,8 @@ main = do hello "Haskell" helloStruct T{a = True, b = 42} helloStruct T{a = False, b = maxBound} + helloEnum E1 + helloEnum E3 helloShape $ Circle 3.14 helloShape $ Rectangle 10.0 5.0 putStrLn $ "3 + 4 = " <> show (add 3 4) diff --git a/lib/GarnetRs/Wrapped.hs b/lib/GarnetRs/Wrapped.hs index 2f80058..a9e1ade 100644 --- a/lib/GarnetRs/Wrapped.hs +++ b/lib/GarnetRs/Wrapped.hs @@ -1,11 +1,20 @@ +{-# LANGUAGE PatternSynonyms #-} + -- TODO automate this sort of high level wrapper boilerplate -- or look at upstream plans: https://github.com/well-typed/hs-bindgen/issues?q=state%3Aopen%20label%3A%22highlevel%22 module GarnetRs.Wrapped ( T (..), + Raw.E (..), + -- TODO hmm, we don't really want to have to list all of these... + -- is there an option to make them not be patterns at all? + pattern Raw.E1, + pattern Raw.E2, + pattern Raw.E3, Shape (..), BTree (..), hello, helloStruct, + helloEnum, helloShape, add, sumTree, @@ -62,6 +71,9 @@ hello = flip useAsCString $ Raw.hello . unsafeFromPtr helloStruct :: T -> IO () helloStruct = flip with (Raw.hello_struct . unsafeFromPtr) . convertT +helloEnum :: Raw.E -> IO () +helloEnum = flip with (Raw.hello_enum . unsafeFromPtr) + helloShape :: Shape -> IO () helloShape = flip with (Raw.hello_shape . unsafeFromPtr) . convertShape diff --git a/rust/lib.rs b/rust/lib.rs index 4b96379..d35f15f 100644 --- a/rust/lib.rs +++ b/rust/lib.rs @@ -27,6 +27,19 @@ extern "C" fn hello_struct(t: &T) { say_hello(&format!("{:?}", t)) } +#[repr(C)] +#[derive(Debug)] +enum E { + E1, + E2, + E3, +} + +#[unsafe(no_mangle)] +extern "C" fn hello_enum(e: &E) { + say_hello(&format!("{:?}", e)) +} + #[repr(C)] #[derive(Debug)] enum Shape {