[workspace]

members = [
    "tests/ensure_no_std",
]

[package]
name = "regorus"
description = "A fast, lightweight Rego (OPA policy language) interpreter"
version = "0.4.0"
edition = "2021"
license-file = "LICENSE"
repository = "https://github.com/microsoft/regorus"
keywords = ["interpreter", "no_std", "opa", "policy-as-code", "rego"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
doctest = false

[features]
default = ["full-opa", "arc"]

arc = ["scientific/arc"]
ast = []
base64 = ["dep:data-encoding"]
base64url = ["dep:data-encoding"]
coverage = []
hex = ["dep:data-encoding"]
http = []
glob = ["dep:globset"]
graph = []
jsonschema = ["dep:jsonschema"]
no_std = ["lazy_static/spin_no_std"]
opa-runtime = []
regex = ["dep:regex"]
semver = ["dep:semver"]
std = ["rand/std", "rand/std_rng", "serde_json/std", "msvc_spectre_libs" ]
time = ["dep:chrono", "dep:chrono-tz"]
uuid = ["dep:uuid"]
urlquery = ["dep:url"]
yaml = ["serde_yaml"]
full-opa = [
    "base64",
    "base64url",
    "coverage",
    "glob",
    "graph",
    "hex",
    "http",
    "jsonschema",
    "opa-runtime",
    "regex",
    "semver",
    "std",
    "time",
    "uuid",
    "urlquery",
    "yaml",

    #"rego-extensions"
]

# Features that can be used in no_std environments.
# Note that: the spin_no_std feature in lazy_static must be specified.
opa-no-std = [
  "arc",
  "base64",
  "base64url",
  "coverage",
  "graph",
  "hex",
  "no_std",
  "opa-runtime",
  "regex",
  "semver",
  # Configure lazy_static to use spinlocks.
  "lazy_static/spin_no_std"
]

# Rego language extensions
rego-extensions = []

# This feature enables some testing utils for OPA tests.
opa-testutil = []
rand = ["dep:rand"]

[dependencies]
anyhow = { version = "1.0.45", default-features = false }
serde = {version = "1.0.150", default-features = false, features = ["derive", "rc"] }
serde_json = { version = "1.0.89", default-features = false, features = ["alloc"] }
lazy_static =  { version = "1.4.0", default-features = false }

data-encoding = { version = "2.8.0", optional = true, default-features=false, features = ["alloc"] }
scientific = { version = "0.5.3" }

globset = { version = "0.4.16", features = ["simd-accel"], default-features = false, optional = true }
regex = {version = "1.11.1", optional = true, default-features = false }
semver = {version = "1.0.25", optional = true, default-features = false }
url = { version = "2.5.4", optional = true }
uuid = { version = "1.15.1", default-features = false, features = ["v4", "fast-rng"], optional = true }
jsonschema = { version = "0.30.0", default-features = false, optional = true }
chrono = { version = "0.4.40", optional = true }
chrono-tz = { version = "0.10.1", optional = true }

serde_yaml = {version = "0.9.16", default-features = false, optional = true }
# Specify thread_rng for in order to use random_range
rand = { version = "0.9.0", default-features = false, features = ["thread_rng"], optional = true }

# Causes the project to link with the Spectre-mitigated CRT and libs.
msvc_spectre_libs = { version = "0.1", features = ["error"], optional = true }

[dev-dependencies]
anyhow = "1.0.45"
cfg-if = "1.0.0"
clap = { version = "4.5.38", features = ["derive"] }
prettydiff = { version = "0.8.0", default-features = false }
serde_yaml = "0.9.16"
test-generator = "0.3.1"
walkdir = "2.3.2"

[build-dependencies]
anyhow = "1.0"

[profile.release]
debug = true
lto = true
codegen-units = 1

[[test]]
name="opa"
harness=false
test=false
required-features = ["full-opa"]

[[test]]
name="aci"
harness=false
test=false

[[test]]
name="kata"
harness=false
test=false

[[example]]
name="regorus"
harness=false
test=false
doctest=false

[package.metadata.docs.rs]
# To build locally:
# RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --no-deps
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
