openfga-dsl-parser 1.0.0

Parsing and JSON transformer for the OpenFGA authorization DSL
Documentation
use openfga_dsl_parser::*;
use serde_json::Value;

#[test]
fn parses_full_doc() {
    let i = "type team
  relations
    define member as self
type repo
  relations
    define admin as self or repo_admin from owner
    define maintainer as self or admin
    define owner as self
    define reader as self or triager or repo_reader from owner
    define triager as self or writer
    define writer as self or maintainer or repo_writer from owner
type org
  relations
    define billing_manager as self or owner
    define member as self or owner
    define owner as self
    define repo_admin as self
    define repo_reader as self
    define repo_writer as self
type app
  relations
    define app_manager as self or owner from owner
    define owner as self";
    let exp_raw = r#"{
  "type_definitions": [
    {
      "type": "team",
      "relations": {
        "member": {
          "this": {}
        }
      }
    },
    {
      "type": "repo",
      "relations": {
        "admin": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "tupleToUserset": {
                  "tupleset": {
                    "object": "",
                    "relation": "owner"
                  },
                  "computedUserset": {
                    "object": "",
                    "relation": "repo_admin"
                  }
                }
              }
            ]
          }
        },
        "maintainer": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "admin"
                }
              }
            ]
          }
        },
        "owner": {
          "this": {}
        },
        "reader": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "triager"
                }
              },
              {
                "tupleToUserset": {
                  "tupleset": {
                    "object": "",
                    "relation": "owner"
                  },
                  "computedUserset": {
                    "object": "",
                    "relation": "repo_reader"
                  }
                }
              }
            ]
          }
        },
        "triager": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "writer"
                }
              }
            ]
          }
        },
        "writer": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "maintainer"
                }
              },
              {
                "tupleToUserset": {
                  "tupleset": {
                    "object": "",
                    "relation": "owner"
                  },
                  "computedUserset": {
                    "object": "",
                    "relation": "repo_writer"
                  }
                }
              }
            ]
          }
        }
      }
    },
    {
      "type": "org",
      "relations": {
        "billing_manager": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "owner"
                }
              }
            ]
          }
        },
        "member": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "computedUserset": {
                  "object": "",
                  "relation": "owner"
                }
              }
            ]
          }
        },
        "owner": {
          "this": {}
        },
        "repo_admin": {
          "this": {}
        },
        "repo_reader": {
          "this": {}
        },
        "repo_writer": {
          "this": {}
        }
      }
    },
    {
      "type": "app",
      "relations": {
        "app_manager": {
          "union": {
            "child": [
              {
                "this": {}
              },
              {
                "tupleToUserset": {
                  "tupleset": {
                    "object": "",
                    "relation": "owner"
                  },
                  "computedUserset": {
                    "object": "",
                    "relation": "owner"
                  }
                }
              }
            ]
          }
        },
        "owner": {
          "this": {}
        }
      }
    }
  ]
}"#;
    let exp: Value = serde_json::from_str(exp_raw).unwrap();

    let mut parser = Parser::new(&i);
    let doc = parser.parse_document().unwrap();

    let res = json::JsonTransformer::new(&doc)
        .serialize();
    assert_eq!(exp, serde_json::from_str::<Value>(&res).unwrap());
}