load("@fbsource//tools/build_defs:rust_bindgen_library.bzl", "rust_bindgen_library")
load("@fbsource//tools/build_defs/dirsync:fb_dirsync_cpp_library.bzl", "fb_dirsync_cpp_library")
load("@fbsource//tools/build_defs/dirsync:fb_dirsync_rule.bzl", "fb_dirsync_rule")
load("@fbsource//tools/build_defs/dirsync:fb_dirsync_rust_library.bzl", "fb_dirsync_rust_library")

oncall("rust_libraries")

fb_dirsync_rule(
    name = "string-sys",
    allowlist_funcs = [
        "facebook::rust::.*",
    ],
    allowlist_types = [
        "facebook::rust::.*",
        "folly::(Mutable)?(StringPiece|ByteRange)",
    ],
    allowlist_vars = [
        "facebook::rust::.*",
    ],
    cpp_deps = [":string-ffi"],
    # Don't use modules so that we can import std_string from here
    # into other modules needing C++ folly:StringPiece.
    cxx_namespaces = False,
    fbcode_rule = rust_bindgen_library,
    generate = ("types", "methods", "functions", "vars"),
    header = "string.h",
    opaque_types = [
        "folly::(Mutable)?(StringPiece|ByteRange)",
    ],
    pin_crate = True,
    src_includes = ["string.rs"],
    deps = [
        "fbsource//third-party/rust:cxx",
    ],
)

fb_dirsync_cpp_library(
    name = "string-ffi",
    srcs = ["string.cpp"],
    headers = ["string.h"],
    exported_deps = [
        "//folly:range",
    ],
)

fb_dirsync_rust_library(
    name = "string",
    srcs = ["lib.rs"],
    deps = [":string-sys"],
)
