diff --git a/flake.lock b/flake.lock index d876244..2bf8eae 100644 --- a/flake.lock +++ b/flake.lock @@ -527,17 +527,17 @@ "hs-bindgen-src": { "flake": false, "locked": { - "lastModified": 1773399083, - "narHash": "sha256-oF6E1/zRZ4iiZs9QjtQMvHnLMfq/W6CXOX44QbDGYXs=", + "lastModified": 1774599157, + "narHash": "sha256-jgV67xhWzxMwyiyy5RPtu+VQvGTt+FoMXCWJcZ7lczY=", "owner": "well-typed", "repo": "hs-bindgen", - "rev": "6ca94188abd756a1fb4dd8a4037de3fa7dca0765", + "rev": "3c4af10590d0d09e825a9735e9a03d7f60914e21", "type": "github" }, "original": { "owner": "well-typed", + "ref": "release-0.1-alpha2", "repo": "hs-bindgen", - "rev": "6ca94188abd756a1fb4dd8a4037de3fa7dca0765", "type": "github" } }, @@ -561,17 +561,16 @@ "libclang-src": { "flake": false, "locked": { - "lastModified": 1773221966, - "narHash": "sha256-VPG7jKdq2g/Hwf5cPiy4coAvLULxDeA4KHCVkNSSs5w=", + "lastModified": 1774600891, + "narHash": "sha256-LTAyNMY4Vu0vPeEq2wXB0KWY4kGtqtHTRmADjLdkv78=", "owner": "well-typed", "repo": "libclang", - "rev": "d6e482df49b88375cf3075928a78ee86c2a068d4", + "rev": "1054474fae403bfb52c7919680cac03d3d3d4237", "type": "github" }, "original": { "owner": "well-typed", "repo": "libclang", - "rev": "d6e482df49b88375cf3075928a78ee86c2a068d4", "type": "github" } }, diff --git a/flake.nix b/flake.nix index d6c8926..0b7bf68 100644 --- a/flake.nix +++ b/flake.nix @@ -3,8 +3,8 @@ nix-haskell.url = "github:reflex-frp/nix-haskell"; nixpkgs.follows = "nix-haskell/nixpkgs"; hls-src = { url = "github:haskell/haskell-language-server/2.13.0.0"; flake = false; }; - hs-bindgen-src = { url = "github:well-typed/hs-bindgen/6ca94188abd756a1fb4dd8a4037de3fa7dca0765"; flake = false; }; - libclang-src = { url = "github:well-typed/libclang/d6e482df49b88375cf3075928a78ee86c2a068d4"; flake = false; }; + hs-bindgen-src = { url = "github:well-typed/hs-bindgen/release-0.1-alpha2"; flake = false; }; + libclang-src = { url = "github:well-typed/libclang"; flake = false; }; flake-utils.url = "github:numtide/flake-utils"; crane.url = "github:ipetkov/crane"; rust-overlay = { diff --git a/garnet.cabal b/garnet.cabal index c10f382..00decef 100644 --- a/garnet.cabal +++ b/garnet.cabal @@ -46,7 +46,6 @@ library base, hs-bindgen, hs-bindgen-runtime, - primitive, template-haskell, executable garnet diff --git a/lib/GarnetRs/Raw.hs b/lib/GarnetRs/Raw.hs index 98b15ad..61312fa 100644 --- a/lib/GarnetRs/Raw.hs +++ b/lib/GarnetRs/Raw.hs @@ -1,6 +1,5 @@ {-# LANGUAGE CApiFFI #-} {-# LANGUAGE DerivingVia #-} -{-# LANGUAGE FieldSelectors #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TemplateHaskell #-} @@ -42,7 +41,7 @@ do withHsBindgen def { clang = def{extraIncludeDirs = Pkg "rust/target/debug" : systemDirs} - , fieldNamingStrategy = EnableRecordDot + , fieldNamingStrategy = OmitFieldPrefixes } def $ hashInclude "garnet_rs.h" diff --git a/lib/GarnetRs/Wrapped.hs b/lib/GarnetRs/Wrapped.hs index 4ad72c2..51d9255 100644 --- a/lib/GarnetRs/Wrapped.hs +++ b/lib/GarnetRs/Wrapped.hs @@ -34,8 +34,8 @@ data Shape | Rectangle CDouble CDouble convertShape :: Shape -> Raw.Shape convertShape = \case - Circle r -> Raw.Shape Raw.Circle $ Raw.set_shape_body_circle $ Raw.Circle_Body r - Rectangle w h -> Raw.Shape Raw.Rectangle $ Raw.set_shape_body_rectangle $ Raw.Rectangle_Body w h + Circle r -> Raw.Shape Raw.Circle $ Raw.set_shape_circle_circle $ Raw.Circle_Body r + Rectangle w h -> Raw.Shape Raw.Rectangle $ Raw.set_shape_circle_rectangle $ Raw.Rectangle_Body w h data BTree a = Leaf a @@ -43,14 +43,14 @@ data BTree a withBTree :: BTree Int64 -> (Raw.BTreeC -> IO a) -> IO a withBTree = runContT . fix \f -> \case - Leaf v -> pure $ Raw.BTreeC Raw.Leaf $ Raw.set_bTreeC_body_leaf $ Raw.Leaf_Body v + Leaf v -> pure $ Raw.BTreeC Raw.Leaf $ Raw.set_bTreeC_leaf_leaf $ Raw.Leaf_Body v Fork l r -> do lRaw <- f l rRaw <- f r lPtr <- ContT alloca rPtr <- ContT alloca lift $ poke lPtr lRaw >> poke rPtr rRaw - pure . Raw.BTreeC Raw.Fork . Raw.set_bTreeC_body_fork $ + pure . Raw.BTreeC Raw.Fork . Raw.set_bTreeC_leaf_fork $ Raw.Fork_Body (unsafeFromPtr lPtr) (unsafeFromPtr rPtr) hello :: ByteString -> IO () diff --git a/rust/build.rs b/rust/build.rs index d633ace..45a8313 100644 --- a/rust/build.rs +++ b/rust/build.rs @@ -13,31 +13,15 @@ fn main() { .generate() .expect("Unable to generate bindings"); - // TODO vibe-coded workaround for hs-bindgen issue: - // https://github.com/well-typed/hs-bindgen/issues/1649#issuecomment-3994425922 let mut buf = Vec::new(); bindings.write(&mut buf); let header = String::from_utf8(buf).unwrap(); - let mut patched = String::new(); - let mut saw_union = false; - for line in header.lines() { - if line == " };" && saw_union { - patched.push_str(" } body;\n"); - saw_union = false; - continue; - } - if line == " union {" { - saw_union = true; - } - patched.push_str(line); - patched.push('\n'); - } fs::write( PathBuf::from(&crate_dir) .join("target") .join(&profile) .join("garnet_rs.h"), - patched, + header, ) .unwrap(); }