// sign_request — Sign a POST request with HMAC-SHA256.

///|
fn main {
  let body = @utf8.encode("{\"hello\": \"world\"}")
  let h = @hsig.OrderedHeaders::new()
  let _ = h.append("content-type", "application/json")
  let _ = h.append(
    "content-digest",
    "sha-256=:" + @hsig.base64_encode_bytes(@hsig.sha256_raw(body)) + ":",
  )
  let req = @hsig.RequestContext::new_default(
    "POST",
    "https",
    "example.com",
    "/api/orders",
    Some("source=web"),
    h,
    Some(body),
  ).unwrap()
  let key : @hsig.KeyRecord = {
    keyid: "local-key",
    algorithm: "hmac-sha256",
    material: @hsig.SharedSecret(@utf8.encode("secret")),
  }
  let params : @hsig.SignatureParameters = {
    created: Some(@hsig.SystemClock::new().now_unix_seconds()),
    expires: None,
    keyid: Some("local-key"),
    alg: Some("hmac-sha256"),
    nonce: None,
    tag: None,
    extensions: Array::new(),
  }
  let options : @hsig.SignOptions = {
    label: "sig1",
    components: [
      @hsig.covered_derived(@hsig.DerivedComponent::Method),
      @hsig.covered_derived(@hsig.DerivedComponent::TargetUri),
      @hsig.covered_field("content-digest"),
    ],
    parameters: params,
    algorithm: "hmac-sha256",
    key,
  }
  let signed = @hsig.sign_request(req, options, @hsig.Limits::default()).unwrap()
  println("Signature-Input: " + signed.signature_input)
  println("Signature:       " + signed.signature)
}