Projects STRLCPY graphql-engine Commits 209ec112
🤬
  • Update to ndc-spec-0.1.2 (#443)

    <!-- Thank you for submitting this PR! :) -->
    
    ## Description
    
    - Update to `ndc-spec`-`0.1.2`
    - Use `ndc_models` since `ndc_client` was removed
    - Use `Int32` in `custom_connector` everywhere
    
    <!--
      Questions to consider answering:
      1. What user-facing changes are being made?
    2. What are issues related to this PR? (Consider adding `(close
    #<issue-no>)` to the PR title)
      3. What is the conceptual design behind this PR?
      4. How can this PR be tested/verified?
      5. Does the PR have limitations?
      6. Does the PR introduce breaking changes?
    -->
    
    V3_GIT_ORIGIN_REV_ID: 00c6e7a6c213ab0de31303a93f8446c1d371c538
  • Loading...
  • Phil Freeman committed with hasura-bot 1 month ago
    209ec112
    1 parent e56594fe
  • ■ ■ ■ ■ ■ ■
    v3/Cargo.lock
    skipped 745 lines
    746 746  dependencies = [
    747 747   "axum",
    748 748   "indexmap 2.2.6",
    749  - "ndc-client",
     749 + "ndc-models",
    750 750   "regex",
    751 751   "serde_json",
    752 752   "tokio",
    skipped 217 lines
    970 970   "lang-graphql",
    971 971   "lazy_static",
    972 972   "mockito",
    973  - "ndc-client",
     973 + "ndc-models",
    974 974   "nonempty",
    975 975   "open-dds",
    976 976   "opendds-derive",
    skipped 894 lines
    1871 1871  ]
    1872 1872   
    1873 1873  [[package]]
    1874  -name = "ndc-client"
    1875  -version = "0.1.1"
    1876  -source = "git+https://github.com/hasura/ndc-spec.git?tag=v0.1.1#17c61946cc9a3ff6dcee1d535af33141213b639a"
     1874 +name = "ndc-models"
     1875 +version = "0.1.2"
     1876 +source = "git+https://github.com/hasura/ndc-spec.git?tag=v0.1.2#6e7d12a31787d5f618099a42ddc0bea786438c00"
    1877 1877  dependencies = [
    1878  - "async-trait",
    1879 1878   "indexmap 2.2.6",
    1880  - "opentelemetry",
    1881  - "reqwest",
    1882 1879   "schemars",
    1883 1880   "serde",
    1884  - "serde_derive",
    1885 1881   "serde_json",
    1886 1882   "serde_with",
    1887  - "url",
    1888 1883  ]
    1889 1884   
    1890 1885  [[package]]
    skipped 95 lines
    1986 1981   "goldenfile",
    1987 1982   "indexmap 2.2.6",
    1988 1983   "lazy_static",
    1989  - "ndc-client",
     1984 + "ndc-models",
    1990 1985   "opendds-derive",
    1991 1986   "pretty_assertions",
    1992 1987   "schemars",
    skipped 1910 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/Cargo.toml
    skipped 14 lines
    15 15  [dependencies]
    16 16  axum = "^0.6.9"
    17 17  indexmap = "2"
    18  -ndc-client = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.1" }
     18 +ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.2" }
    19 19  regex = "^1.7.3"
    20 20  serde_json = "^1.0.92"
    21 21  tokio = { version = "^1.26.0", features = ["macros", "parking_lot", "rt-multi-thread"] }
    skipped 1 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/collections/actors.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 80 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/collections/actors_by_movie.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 29 lines
    37 37   details: serde_json::Value::Null,
    38 38   }),
    39 39   ))?;
    40  - let movie_id_int = movie_id.as_i64().ok_or((
    41  - StatusCode::BAD_REQUEST,
    42  - Json(ndc_models::ErrorResponse {
    43  - message: "movie_id must be a integer".into(),
    44  - details: serde_json::Value::Null,
    45  - }),
    46  - ))?;
     40 + let movie_id_int: i32 = movie_id
     41 + .as_i64()
     42 + .ok_or((
     43 + StatusCode::BAD_REQUEST,
     44 + Json(ndc_models::ErrorResponse {
     45 + message: "movie_id must be a integer".into(),
     46 + details: serde_json::Value::Null,
     47 + }),
     48 + ))?
     49 + .try_into()
     50 + .map_err(|_| {
     51 + (
     52 + StatusCode::BAD_REQUEST,
     53 + Json(ndc_models::ErrorResponse {
     54 + message: "movie_id is out of range".into(),
     55 + details: serde_json::Value::Null,
     56 + }),
     57 + )
     58 + })?;
    47 59   
    48 60   let mut actors_by_movie = vec![];
    49 61   
    skipped 10 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/collections/institutions.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4   
    5 5  use crate::{
    6 6   query::Result,
    skipped 23 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/collections/movies.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4   
    5 5  use crate::{
    6 6   query::Result,
    skipped 23 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/collections/movies_by_actor_name.rs
    1 1  use std::collections::{BTreeMap, HashSet};
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4   
    5 5  use crate::{
    6 6   query::{parse_object_argument, Result},
    skipped 31 lines
    38 38   
    39 39   let movie_ids = filter_actors_by_name(state, filter_first_name, filter_last_name)
    40 40   .map(|result| result.and_then(get_actor_movie_id))
    41  - .collect::<Result<HashSet<i64>>>()?;
     41 + .collect::<Result<HashSet<i32>>>()?;
    42 42   
    43 43   let movies_by_actor = movie_ids
    44 44   .iter()
    skipped 6 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/collections.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4   
    5 5  use crate::{
    6 6   query::Result,
    skipped 34 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/actor_names_by_movie.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 65 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_actor_by_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 30 lines
    38 38   details: serde_json::Value::Null,
    39 39   }),
    40 40   ))?;
    41  - if let Some(id) = id_value.as_i64() {
    42  - let actor = state.actors.get(&id);
    43  - 
    44  - match actor {
    45  - None => Ok(vec![BTreeMap::from_iter([(
    46  - "__value".into(),
    47  - serde_json::Value::Null,
    48  - )])]),
    49  - Some(actor) => {
    50  - let actor_value = serde_json::to_value(actor).map_err(|_| {
    51  - (
    52  - StatusCode::INTERNAL_SERVER_ERROR,
    53  - Json(ndc_models::ErrorResponse {
    54  - message: "unable to encode value".into(),
    55  - details: serde_json::Value::Null,
    56  - }),
    57  - )
    58  - })?;
    59  - 
    60  - Ok(vec![BTreeMap::from_iter([("__value".into(), actor_value)])])
    61  - }
    62  - }
    63  - } else {
    64  - Err((
     41 + let id = id_value
     42 + .as_i64()
     43 + .ok_or((
    65 44   StatusCode::INTERNAL_SERVER_ERROR,
    66 45   Json(ndc_models::ErrorResponse {
    67  - message: "incorrect type for id".into(),
     46 + message: "argument 'id' is not an integer".into(),
    68 47   details: serde_json::Value::Null,
    69 48   }),
    70  - ))
     49 + ))?
     50 + .try_into()
     51 + .map_err(|_| {
     52 + (
     53 + StatusCode::BAD_REQUEST,
     54 + Json(ndc_models::ErrorResponse {
     55 + message: "argument 'id' is out of range".into(),
     56 + details: serde_json::Value::Null,
     57 + }),
     58 + )
     59 + })?;
     60 + let actor = state.actors.get(&id);
     61 + 
     62 + match actor {
     63 + None => Ok(vec![BTreeMap::from_iter([(
     64 + "__value".into(),
     65 + serde_json::Value::Null,
     66 + )])]),
     67 + Some(actor) => {
     68 + let actor_value = serde_json::to_value(actor).map_err(|_| {
     69 + (
     70 + StatusCode::INTERNAL_SERVER_ERROR,
     71 + Json(ndc_models::ErrorResponse {
     72 + message: "unable to encode value".into(),
     73 + details: serde_json::Value::Null,
     74 + }),
     75 + )
     76 + })?;
     77 + 
     78 + Ok(vec![BTreeMap::from_iter([("__value".into(), actor_value)])])
     79 + }
    71 80   }
    72 81  }
    73 82   
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_actors_by_movie_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 31 lines
    39 39   details: serde_json::Value::Null,
    40 40   }),
    41 41   ))?;
    42  - let movie_id_int = movie_id.as_i64().ok_or((
    43  - StatusCode::BAD_REQUEST,
    44  - Json(ndc_models::ErrorResponse {
    45  - message: "movie_id must be a integer".into(),
    46  - details: serde_json::Value::Null,
    47  - }),
    48  - ))?;
     42 + let movie_id_int: i32 = movie_id
     43 + .as_i64()
     44 + .ok_or((
     45 + StatusCode::BAD_REQUEST,
     46 + Json(ndc_models::ErrorResponse {
     47 + message: "movie_id must be a integer".into(),
     48 + details: serde_json::Value::Null,
     49 + }),
     50 + ))?
     51 + .try_into()
     52 + .map_err(|_| {
     53 + (
     54 + StatusCode::BAD_REQUEST,
     55 + Json(ndc_models::ErrorResponse {
     56 + message: "movie_id is out of range".into(),
     57 + details: serde_json::Value::Null,
     58 + }),
     59 + )
     60 + })?;
    49 61   
    50 62   let mut actors_by_movie = vec![];
    51 63   
    skipped 24 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_actors_by_movie_id_bounds.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 82 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_actors_by_name.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   collections::actors::filter_actors_by_name,
    skipped 52 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_all_actors.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 45 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_all_movies.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 45 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/get_movie_by_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 30 lines
    38 38   details: serde_json::Value::Null,
    39 39   }),
    40 40   ))?;
    41  - if let Some(id) = id_value.as_i64() {
    42  - let movie = state.movies.get(&id);
    43  - 
    44  - match movie {
    45  - None => Ok(vec![BTreeMap::from_iter([(
    46  - "__value".into(),
    47  - serde_json::Value::Null,
    48  - )])]),
    49  - Some(movie) => {
    50  - let movie_value = serde_json::to_value(movie).map_err(|_| {
    51  - (
    52  - StatusCode::INTERNAL_SERVER_ERROR,
    53  - Json(ndc_models::ErrorResponse {
    54  - message: "unable to encode value".into(),
    55  - details: serde_json::Value::Null,
    56  - }),
    57  - )
    58  - })?;
    59  - 
    60  - Ok(vec![BTreeMap::from_iter([("__value".into(), movie_value)])])
    61  - }
    62  - }
    63  - } else {
    64  - Err((
     41 + let id = id_value
     42 + .as_i64()
     43 + .ok_or((
    65 44   StatusCode::INTERNAL_SERVER_ERROR,
    66 45   Json(ndc_models::ErrorResponse {
    67  - message: "incorrect type for id".into(),
     46 + message: "incorrect type for movie_id".into(),
    68 47   details: serde_json::Value::Null,
    69 48   }),
    70  - ))
     49 + ))?
     50 + .try_into()
     51 + .map_err(|_| {
     52 + (
     53 + StatusCode::BAD_REQUEST,
     54 + Json(ndc_models::ErrorResponse {
     55 + message: "movie_id is out of range".into(),
     56 + details: serde_json::Value::Null,
     57 + }),
     58 + )
     59 + })?;
     60 + let movie = state.movies.get(&id);
     61 + 
     62 + match movie {
     63 + None => Ok(vec![BTreeMap::from_iter([(
     64 + "__value".into(),
     65 + serde_json::Value::Null,
     66 + )])]),
     67 + Some(movie) => {
     68 + let movie_value = serde_json::to_value(movie).map_err(|_| {
     69 + (
     70 + StatusCode::INTERNAL_SERVER_ERROR,
     71 + Json(ndc_models::ErrorResponse {
     72 + message: "unable to encode value".into(),
     73 + details: serde_json::Value::Null,
     74 + }),
     75 + )
     76 + })?;
     77 + 
     78 + Ok(vec![BTreeMap::from_iter([("__value".into(), movie_value)])])
     79 + }
    71 80   }
    72 81  }
    73 82   
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/latest_actor.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 17 lines
    25 25   let latest_id = state
    26 26   .actors
    27 27   .iter()
    28  - .filter_map(|(_id, a)| a.get("id").and_then(|v| v.as_i64()))
     28 + .filter_map(|(_id, a)| a.get("id").and_then(|v| v.as_i64()?.try_into().ok()))
    29 29   .max();
    30 30   
    31 31   if let Some(id) = latest_id {
    skipped 27 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/latest_actor_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 35 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions/latest_actor_name.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 38 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/functions.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::Result,
    skipped 57 lines
  • ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/main.rs
    skipped 7 lines
    8 8  };
    9 9   
    10 10  use custom_connector::state::AppState;
    11  -use ndc_client::models as ndc_models;
    12 11   
    13 12  type Result<A> = std::result::Result<A, (StatusCode, Json<ndc_models::ErrorResponse>)>;
    14 13   
    skipped 84 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/mutation.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{procedures, state::AppState};
    7 7   
    skipped 41 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/noop_procedure.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4   
    5 5  use crate::query::Result;
    6 6   
    skipped 19 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/update_actor_name_by_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::{eval_nested_field, Result},
    skipped 50 lines
    58 58   details: serde_json::Value::Null,
    59 59   }),
    60 60   ))?;
    61  - let id_int = id.as_i64().ok_or((
    62  - StatusCode::BAD_REQUEST,
    63  - Json(ndc_models::ErrorResponse {
    64  - message: "argument 'id' is not an integer".into(),
    65  - details: serde_json::Value::Null,
    66  - }),
    67  - ))?;
     61 + let id_int = id
     62 + .as_i64()
     63 + .ok_or((
     64 + StatusCode::BAD_REQUEST,
     65 + Json(ndc_models::ErrorResponse {
     66 + message: "argument 'id' is not an integer".into(),
     67 + details: serde_json::Value::Null,
     68 + }),
     69 + ))?
     70 + .try_into()
     71 + .map_err(|_| {
     72 + (
     73 + StatusCode::BAD_REQUEST,
     74 + Json(ndc_models::ErrorResponse {
     75 + message: "argument 'id' is out of range".into(),
     76 + details: serde_json::Value::Null,
     77 + }),
     78 + )
     79 + })?;
    68 80   
    69 81   let current_state = state.actors.clone();
    70 82   let old_row = current_state.get(&id_int);
    skipped 36 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/uppercase_actor_name_by_id.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::{eval_nested_field, Result},
    skipped 13 lines
    21 21   details: serde_json::Value::Null,
    22 22   }),
    23 23   ))?;
    24  - let id_int = id.as_i64().ok_or((
    25  - StatusCode::BAD_REQUEST,
    26  - Json(ndc_models::ErrorResponse {
    27  - message: "argument 'id' is not an integer".into(),
    28  - details: serde_json::Value::Null,
    29  - }),
    30  - ))?;
     24 + let id_int = id
     25 + .as_i64()
     26 + .ok_or((
     27 + StatusCode::BAD_REQUEST,
     28 + Json(ndc_models::ErrorResponse {
     29 + message: "argument 'id' is not an integer".into(),
     30 + details: serde_json::Value::Null,
     31 + }),
     32 + ))?
     33 + .try_into()
     34 + .map_err(|_| {
     35 + (
     36 + StatusCode::BAD_REQUEST,
     37 + Json(ndc_models::ErrorResponse {
     38 + message: "argument 'id' is out of range".into(),
     39 + details: serde_json::Value::Null,
     40 + }),
     41 + )
     42 + })?;
    31 43   let current_state = state.actors.clone();
    32 44   let old_row = current_state.get(&id_int);
    33 45   match &old_row {
    skipped 51 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/uppercase_all_actor_names.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::{eval_nested_field, Result},
    skipped 61 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/uppercase_all_actor_names_return_names_list.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{query::Result, state::AppState};
    7 7   
    skipped 42 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures/upsert_actor.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{
    7 7   query::{eval_nested_field, Result},
    skipped 44 lines
    52 52   let id = actor_obj.get("id").ok_or((
    53 53   StatusCode::BAD_REQUEST,
    54 54   Json(ndc_models::ErrorResponse {
    55  - message: " ".into(),
    56  - details: serde_json::Value::Null,
    57  - }),
    58  - ))?;
    59  - let id_int = id.as_i64().ok_or((
    60  - StatusCode::BAD_REQUEST,
    61  - Json(ndc_models::ErrorResponse {
    62  - message: " ".into(),
     55 + message: "required argument field 'id' is missing".into(),
    63 56   details: serde_json::Value::Null,
    64 57   }),
    65 58   ))?;
     59 + let id_int = id
     60 + .as_i64()
     61 + .ok_or((
     62 + StatusCode::BAD_REQUEST,
     63 + Json(ndc_models::ErrorResponse {
     64 + message: "argument 'id' is not an integer".into(),
     65 + details: serde_json::Value::Null,
     66 + }),
     67 + ))?
     68 + .try_into()
     69 + .map_err(|_| {
     70 + (
     71 + StatusCode::BAD_REQUEST,
     72 + Json(ndc_models::ErrorResponse {
     73 + message: "argument 'id' is out of range".into(),
     74 + details: serde_json::Value::Null,
     75 + }),
     76 + )
     77 + })?;
    66 78   let new_row = BTreeMap::from_iter(actor_obj.iter().map(|(k, v)| (k.clone(), v.clone())));
    67 79   let old_row = state.actors.insert(id_int, new_row);
    68 80   old_row.map_or(Ok(serde_json::Value::Null), |old_row| {
    skipped 25 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/procedures.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::{query::Result, state::AppState};
    7 7   
    skipped 48 lines
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/query.rs
    skipped 4 lines
    5 5   
    6 6  use axum::{http::StatusCode, Json};
    7 7  use indexmap::IndexMap;
    8  -use ndc_client::models as ndc_models;
     8 +use ndc_models;
    9 9  use regex::Regex;
    10 10  use serde_json::Value;
    11 11   
    skipped 1117 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/schema.rs
    1  -use ndc_client::models as ndc_models;
     1 +use ndc_models;
    2 2   
    3 3  use crate::{collections, functions, procedures, types};
    4 4   
    skipped 9 lines
    14 14   
    15 15  pub fn get_capabilities() -> ndc_models::CapabilitiesResponse {
    16 16   ndc_models::CapabilitiesResponse {
    17  - version: "0.1.0".into(),
     17 + version: "0.1.2".into(),
    18 18   capabilities: ndc_models::Capabilities {
    19 19   mutation: ndc_models::MutationCapabilities {
    20 20   transactional: None,
    skipped 15 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/state.rs
    skipped 8 lines
    9 9   
    10 10  #[derive(Debug, Clone)]
    11 11  pub struct AppState {
    12  - pub actors: BTreeMap<i64, Row>,
    13  - pub movies: BTreeMap<i64, Row>,
    14  - pub institutions: BTreeMap<i64, Row>,
     12 + pub actors: BTreeMap<i32, Row>,
     13 + pub movies: BTreeMap<i32, Row>,
     14 + pub institutions: BTreeMap<i32, Row>,
    15 15  }
    16 16   
    17  -fn read_json_lines(path: &str) -> Result<BTreeMap<i64, Row>, Box<dyn Error>> {
     17 +fn read_json_lines(path: &str) -> Result<BTreeMap<i32, Row>, Box<dyn Error>> {
    18 18   let file = File::open(path)?;
    19 19   let lines = io::BufReader::new(file).lines();
    20  - let mut records: BTreeMap<i64, Row> = BTreeMap::new();
     20 + let mut records: BTreeMap<i32, Row> = BTreeMap::new();
    21 21   for line in lines {
    22 22   let row: BTreeMap<String, serde_json::Value> = serde_json::from_str(&line?)?;
    23 23   let id = row
    24 24   .get("id")
    25 25   .ok_or("'id' field not found in json file")?
    26 26   .as_i64()
    27  - .ok_or("'id' field was not an integer in json file")?;
     27 + .ok_or("'id' field was not an integer in json file")?
     28 + .try_into()?;
    28 29   records.insert(id, row);
    29 30   }
    30 31   Ok(records)
    skipped 15 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/types/actor.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::query::Result;
    7 7   
    skipped 35 lines
    43 43   }
    44 44  }
    45 45   
    46  -pub(crate) fn get_actor_movie_id(actor: &BTreeMap<String, serde_json::Value>) -> Result<i64> {
     46 +pub(crate) fn get_actor_movie_id(actor: &BTreeMap<String, serde_json::Value>) -> Result<i32> {
    47 47   let actor_movie_id = actor.get("movie_id").ok_or((
    48 48   StatusCode::INTERNAL_SERVER_ERROR,
    49 49   Json(ndc_models::ErrorResponse {
    skipped 1 lines
    51 51   details: serde_json::Value::Null,
    52 52   }),
    53 53   ))?;
    54  - let actor_movie_id_int = actor_movie_id.as_i64().ok_or((
    55  - StatusCode::INTERNAL_SERVER_ERROR,
    56  - Json(ndc_models::ErrorResponse {
    57  - message: "actor movie_id is not an integer".into(),
    58  - details: serde_json::Value::Null,
    59  - }),
    60  - ))?;
     54 + let actor_movie_id_int = actor_movie_id
     55 + .as_i64()
     56 + .ok_or((
     57 + StatusCode::INTERNAL_SERVER_ERROR,
     58 + Json(ndc_models::ErrorResponse {
     59 + message: "actor movie_id is not an integer".into(),
     60 + details: serde_json::Value::Null,
     61 + }),
     62 + ))?
     63 + .try_into()
     64 + .map_err(|_| {
     65 + (
     66 + StatusCode::BAD_REQUEST,
     67 + Json(ndc_models::ErrorResponse {
     68 + message: "actor movie_id is out of range".into(),
     69 + details: serde_json::Value::Null,
     70 + }),
     71 + )
     72 + })?;
    61 73   Ok(actor_movie_id_int)
    62 74  }
    63 75   
  • ■ ■ ■ ■
    v3/crates/custom-connector/src/types/name_query.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use axum::{http::StatusCode, Json};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5   
    6 6  use crate::query::Result;
    7 7   
    skipped 84 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/custom-connector/src/types.rs
    1  -use ndc_client::models as ndc_models;
     1 +use ndc_models;
    2 2  use std::collections::BTreeMap;
    3 3   
    4 4  pub mod actor;
    skipped 19 lines
    24 24   (
    25 25   "Int".into(),
    26 26   ndc_models::ScalarType {
    27  - representation: Some(ndc_models::TypeRepresentation::Integer),
     27 + representation: Some(ndc_models::TypeRepresentation::Int32),
    28 28   aggregate_functions: BTreeMap::from_iter([
    29 29   (
    30 30   "max".into(),
    skipped 196 lines
  • ■ ■ ■ ■
    v3/crates/engine/Cargo.toml
    skipped 39 lines
    40 40  itertools = "0.10.5"
    41 41  json_value_merge = "2.0"
    42 42  lazy_static = "1.4.0"
    43  -ndc-client = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.1" }
     43 +ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.2" }
    44 44  nonempty = "0.8"
    45 45  reqwest = { version = "0.11", features = ["json", "multipart"] }
    46 46  schemars = { version = "0.8.12", features = ["smol_str"] }
    skipped 34 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/explain/types.rs
    1 1  use crate::execute::error;
    2 2  use crate::execute::GraphQLErrors;
    3 3  use lang_graphql::http::GraphQLError;
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5  use nonempty::NonEmpty;
    6 6  use serde::Serialize;
    7 7  use serde_json::json;
    skipped 191 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/arguments.rs
    skipped 1 lines
    2 2   
    3 3  use lang_graphql::ast::common::Name;
    4 4  use lang_graphql::normalized_ast::{InputField, Value};
    5  -use ndc_client::models as ndc_models;
     5 +use ndc_models;
    6 6  use open_dds::types::{CustomTypeName, InbuiltType};
    7 7   
    8 8  use crate::execute::error;
    skipped 155 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/filter.rs
    skipped 2 lines
    3 3  use indexmap::IndexMap;
    4 4  use lang_graphql::ast::common as ast;
    5 5  use lang_graphql::normalized_ast;
    6  -use ndc_client::models as ndc_models;
     6 +use ndc_models;
    7 7  use serde::Serialize;
    8 8   
    9 9  use crate::execute::error;
    skipped 279 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/model_selection.rs
    skipped 1 lines
    2 2   
    3 3  use hasura_authn_core::SessionVariables;
    4 4  use lang_graphql::normalized_ast;
    5  -use ndc_client::models as ndc_models;
     5 +use ndc_models;
    6 6  use open_dds::types::CustomTypeName;
    7 7  use serde::Serialize;
    8 8  use std::collections::BTreeMap;
    skipped 108 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/order_by.rs
    1 1  use std::collections::BTreeMap;
    2 2   
    3 3  use lang_graphql::normalized_ast::{self as normalized_ast, InputField};
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5  use serde::Serialize;
    6 6   
    7 7  use crate::execute::model_tracking::{count_model, UsagesCounts};
    skipped 234 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/permissions.rs
    skipped 1 lines
    2 2   
    3 3  use hasura_authn_core::{SessionVariableValue, SessionVariables};
    4 4  use lang_graphql::normalized_ast;
    5  -use ndc_client::models as ndc_models;
     5 +use ndc_models;
    6 6   
    7 7  use open_dds::types::InbuiltType;
    8 8   
    skipped 293 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/query_root/apollo_federation.rs
    skipped 1 lines
    2 2   
    3 3  use hasura_authn_core::SessionVariables;
    4 4  use lang_graphql::{ast::common as ast, normalized_ast};
    5  -use ndc_client::models as ndc_models;
     5 +use ndc_models;
    6 6  use open_dds::types::CustomTypeName;
    7 7  use serde::Serialize;
    8 8   
    skipped 184 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/query_root/node_field.rs
    skipped 4 lines
    5 5  use base64::{engine::general_purpose, Engine};
    6 6  use hasura_authn_core::SessionVariables;
    7 7  use lang_graphql::{ast::common as ast, normalized_ast};
    8  -use ndc_client::models as ndc_models;
     8 +use ndc_models;
    9 9  use open_dds::types::CustomTypeName;
    10 10  use serde::Serialize;
    11 11   
    skipped 164 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/query_root/select_many.rs
    skipped 5 lines
    6 6  use hasura_authn_core::SessionVariables;
    7 7  use lang_graphql::ast::common as ast;
    8 8  use lang_graphql::normalized_ast;
    9  -use ndc_client::models as ndc_models;
     9 +use ndc_models;
    10 10  use open_dds;
    11 11  use serde::Serialize;
    12 12  use std::collections::BTreeMap;
    skipped 150 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/query_root/select_one.rs
    skipped 7 lines
    8 8  // TODO: Remove once TypeMapping has more than one variant
    9 9  use hasura_authn_core::SessionVariables;
    10 10  use lang_graphql::{ast::common as ast, normalized_ast};
    11  -use ndc_client::models as ndc_models;
     11 +use ndc_models;
    12 12  use open_dds;
    13 13  use serde::Serialize;
    14 14   
    skipped 132 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ir/relationship.rs
    skipped 7 lines
    8 8   types::{CustomTypeName, FieldName},
    9 9  };
    10 10   
    11  -use ndc_client::models as ndc_models;
     11 +use ndc_models;
    12 12  use serde::Serialize;
    13 13   
    14 14  use super::permissions;
    skipped 612 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ndc/client.rs
    1 1  use super::response::handle_response_with_size_limit;
    2  -use ndc_client::models as ndc_models;
     2 +use ndc_models;
    3 3  use reqwest::header::{HeaderMap, HeaderValue};
    4 4  use serde::{de::DeserializeOwned, Deserialize};
    5 5  use std::fmt;
    skipped 318 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/ndc.rs
    skipped 5 lines
    6 6  use gql::normalized_ast;
    7 7  use lang_graphql as gql;
    8 8  use lang_graphql::ast::common as ast;
    9  -use ndc_client::models as ndc_models;
     9 +use ndc_models;
    10 10  use tracing_util::{set_attribute_on_active_span, AttributeVisibility, SpanVisibility};
    11 11   
    12 12  use super::plan::ProcessResponseAs;
    skipped 197 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/plan/commands.rs
    1 1  use indexmap::IndexMap;
    2  -use ndc_client::models as ndc_models;
     2 +use ndc_models;
    3 3  use std::collections::BTreeMap;
    4 4   
    5 5  use super::selection_set;
    skipped 122 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/plan/model_selection.rs
    skipped 1 lines
    2 2   
    3 3  use std::collections::BTreeMap;
    4 4   
    5  -use ndc_client::models as ndc_models;
     5 +use ndc_models;
    6 6   
    7 7  use super::relationships;
    8 8  use super::selection_set;
    skipped 40 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/plan/relationships.rs
    1 1  //! NDC query generation from 'ModelSelection' IR for relationships.
    2 2   
    3  -use ndc_client::models as ndc_models;
     3 +use ndc_models;
    4 4  use std::collections::BTreeMap;
    5 5   
    6 6  use super::selection_set;
    skipped 67 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/plan/selection_set.rs
    1 1  use indexmap::IndexMap;
    2  -use ndc_client::models as ndc_models;
     2 +use ndc_models;
    3 3  use std::collections::{BTreeMap, HashMap};
    4 4   
    5 5  use super::commands;
    skipped 324 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/plan.rs
    skipped 7 lines
    8 8  use indexmap::IndexMap;
    9 9  use lang_graphql as gql;
    10 10  use lang_graphql::ast::common as ast;
    11  -use ndc_client::models as ndc_models;
     11 +use ndc_models;
    12 12  use serde_json as json;
    13 13  use tracing_util::{set_attribute_on_active_span, AttributeVisibility, Traceable};
    14 14   
    skipped 888 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/process_response.rs
    skipped 7 lines
    8 8  use indexmap::IndexMap;
    9 9  use lang_graphql::ast::common::{self as ast, Alias, TypeContainer, TypeName};
    10 10  use lang_graphql::normalized_ast;
    11  -use ndc_client::models as ndc_models;
     11 +use ndc_models;
    12 12  use open_dds::commands::CommandName;
    13 13  use open_dds::types::FieldName;
    14 14   
    skipped 430 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/remote_joins/collect.rs
    skipped 5 lines
    6 6   
    7 7  use indexmap::IndexMap;
    8 8  use lang_graphql::ast::common::{TypeContainer, TypeName};
    9  -use ndc_client::models as ndc_models;
     9 +use ndc_models;
    10 10  use serde_json as json;
    11 11  use std::collections::BTreeMap;
    12 12   
    skipped 290 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/remote_joins/join.rs
    1 1  //! Implements the join phase of Remote Joins execution
    2 2   
    3 3  use indexmap::IndexMap;
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5  use serde_json as json;
    6 6  use std::collections::{BTreeMap, HashMap};
    7 7   
    skipped 183 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/remote_joins/types.rs
    1 1  //! Join tree and related types for remote joins.
    2 2  //!
    3 3  use indexmap::IndexMap;
    4  -use ndc_client::models as ndc_models;
     4 +use ndc_models;
    5 5  use open_dds;
    6 6  use open_dds::arguments::ArgumentName;
    7 7  use open_dds::types::FieldName;
    skipped 182 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/execute/remote_joins.rs
    skipped 76 lines
    77 77  //! [build_remote_command_relationship]: crate::execute::ir::relationship::build_remote_command_relationship
    78 78   
    79 79  use async_recursion::async_recursion;
    80  -use ndc_client::models as ndc_models;
     80 +use ndc_models;
    81 81  use serde_json as json;
    82 82  use std::collections::{BTreeMap, HashMap};
    83 83  use tracing_util::SpanVisibility;
    skipped 96 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/metadata/resolved/argument.rs
    skipped 4 lines
    5 5  };
    6 6  use indexmap::IndexMap;
    7 7  use itertools::Itertools;
    8  -use ndc_client::models as ndc_models;
     8 +use ndc_models;
    9 9  use open_dds::arguments::ArgumentName;
    10 10  use open_dds::types::CustomTypeName;
    11 11  use std::collections::{BTreeMap, HashMap};
    skipped 111 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/engine/src/metadata/resolved/data_connector.rs
    skipped 3 lines
    4 4  use indexmap::IndexMap;
    5 5   
    6 6  use lang_graphql::ast::common::OperationType;
    7  -use ndc_client::models as ndc_models;
     7 +use ndc_models;
    8 8  use open_dds::{
    9 9   data_connector::{
    10 10   self, DataConnectorName, DataConnectorUrl, ReadWriteUrls, VersionedSchemaAndCapabilities,
    skipped 234 lines
    245 245   
    246 246  #[cfg(test)]
    247 247  mod tests {
    248  - use ndc_client::models as ndc_models;
     248 + use ndc_models;
    249 249   use open_dds::data_connector::DataConnectorLinkV1;
    250 250   
    251 251   use super::DataConnectorContext;
    skipped 62 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/metadata/resolved/model.rs
    skipped 16 lines
    17 17  };
    18 18  use indexmap::IndexMap;
    19 19  use lang_graphql::ast::common::{self as ast, Name};
    20  -use ndc_client::models as ndc_models;
     20 +use ndc_models;
    21 21  use open_dds::permissions::{FieldIsNullPredicate, NullableModelPredicate, RelationshipPredicate};
    22 22  use open_dds::types::Deprecated;
    23 23  use open_dds::{
    skipped 1401 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/metadata/resolved/ndc_validation.rs
    1  -use ndc_client::models as ndc_models;
     1 +use ndc_models;
    2 2  use open_dds::{
    3 3   commands::{CommandName, DataConnectorCommand, FunctionName, ProcedureName},
    4 4   data_connector::DataConnectorName,
    skipped 381 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/metadata/resolved/types.rs
    skipped 6 lines
    7 7   
    8 8  use indexmap::IndexMap;
    9 9  use lang_graphql::ast::common as ast;
    10  -use ndc_client::models as ndc_models;
     10 +use ndc_models;
    11 11  use open_dds::data_connector::DataConnectorName;
    12 12  use open_dds::identifier;
    13 13  use open_dds::models::EnableAllOrSpecific;
    skipped 745 lines
  • ■ ■ ■ ■
    v3/crates/engine/src/schema/commands.rs
    skipped 9 lines
    10 10  use lang_graphql::schema as gql_schema;
    11 11  use lang_graphql::schema::InputField;
    12 12  use lang_graphql::schema::Namespaced;
    13  -use ndc_client::models as ndc_models;
     13 +use ndc_models;
    14 14  use open_dds::arguments::ArgumentName;
    15 15  use open_dds::commands::DataConnectorCommand;
    16 16   
    skipped 209 lines
  • ■ ■ ■ ■
    v3/crates/open-dds/Cargo.toml
    skipped 12 lines
    13 13  derive_more = "0.99.17"
    14 14  indexmap = { version = "2", features = ["serde"] }
    15 15  lazy_static = "1.4.0"
    16  -ndc-client = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.1" }
     16 +ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.1.2" }
    17 17  schemars = { version = "0.8.12", features = ["smol_str", "preserve_order"] }
    18 18  serde = "1.0.152"
    19 19  serde_json = { version = "1.0.92", features = ["preserve_order"] }
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/open-dds/metadata.jsonschema
    skipped 574 lines
    575 575   ]
    576 576   },
    577 577   "schema": {
    578  - "$ref": "https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.0-rc.18/ndc-client/tests/json_schema/schema_response.jsonschema"
     578 + "$ref": "https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.2/ndc-models/tests/json_schema/schema_response.jsonschema"
    579 579   },
    580 580   "capabilities": {
    581  - "$ref": "https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.0-rc.18/ndc-client/tests/json_schema/capabilities_response.jsonschema"
     581 + "$ref": "https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.2/ndc-models/tests/json_schema/capabilities_response.jsonschema"
    582 582   }
    583 583   },
    584 584   "additionalProperties": false
    skipped 2881 lines
  • ■ ■ ■ ■ ■ ■
    v3/crates/open-dds/src/data_connector.rs
    1  -use ndc_client::models as ndc_models;
     1 +use ndc_models;
    2 2  use schemars::JsonSchema;
    3 3  use serde::{Deserialize, Serialize};
    4 4   
    skipped 38 lines
    43 43  fn ndc_capabilities_response_v01_schema_reference(
    44 44   _gen: &mut schemars::gen::SchemaGenerator,
    45 45  ) -> schemars::schema::Schema {
    46  - schemars::schema::Schema::new_ref("https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.0-rc.18/ndc-client/tests/json_schema/capabilities_response.jsonschema".into())
     46 + schemars::schema::Schema::new_ref("https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.2/ndc-models/tests/json_schema/capabilities_response.jsonschema".into())
    47 47  }
    48 48   
    49 49  fn ndc_schema_response_v01_schema_reference(
    50 50   _gen: &mut schemars::gen::SchemaGenerator,
    51 51  ) -> schemars::schema::Schema {
    52  - schemars::schema::Schema::new_ref("https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.0-rc.18/ndc-client/tests/json_schema/schema_response.jsonschema".into())
     52 + schemars::schema::Schema::new_ref("https://raw.githubusercontent.com/hasura/ndc-spec/v0.1.2/ndc-models/tests/json_schema/schema_response.jsonschema".into())
    53 53  }
    54 54   
    55 55  #[derive(Serialize, Clone, Debug, PartialEq, opendds_derive::OpenDd)]
    skipped 108 lines
Please wait...
Page is in error, reload to recover