Note:

You are viewing a development version of the library. Goto the latest version.

let data_check t data origin =
  let no_message = "no message" in

  let check_feature features stage =
    let has_feature = List.mem t.name features in
    if not has_feature then
      match origin with
        | Field (fld, where) ->
            Some
              (Printf.sprintf
                 (f_ "Field %s in %s is only available when feature %s is in field %s.")
                 fld where t.name (field_of_stage stage))
        | Section sct ->
            Some
              (Printf.sprintf
                 (f_ "Section %s is only available when features %s is in field %s.")
                 sct t.name (field_of_stage stage))
        | NoOrigin ->
            Some no_message
    else
      None
  in

  let version_is_good ~min_version version fmt =
    let version_is_good =
      OASISVersion.comparator_apply
        version (OASISVersion.VGreaterEqual min_version)
    in
      Printf.ksprintf
        (fun str ->
           if version_is_good then
             None
           else
             Some str)
        fmt
  in

  match origin, t.plugin, t.publication with
    | _, _, InDev Alpha -> check_feature data.Data.alpha_features Alpha
    | _, _, InDev Beta -> check_feature data.Data.beta_features Beta
    | Field(fld, where), NoneSinceVersion min_version ->
        version_is_good ~min_version data.Data.oasis_version
          (f_ "Field %s in %s is only valid since OASIS v%s, update OASISFormat field from '%s' to '%s' after checking OASIS changelog.")
          fld where (string_of_version min_version)
          (string_of_version data.Data.oasis_version)
          (string_of_version min_version)

    | Field(fld, where), Some(plugin_knd, plugin_name, _),
      SinceVersion min_version ->
        begin
          try
            let plugin_version_current =
              try
                match Data.plugin_version plugin_knd plugin_name data with
                  | Some ver -> ver
                  | None ->
                      failwithf
                        (f_ "Field %s in %s is only valid for the OASIS plugin %s since v%s, but no plugin version is defined in the _oasis file, change '%s' to '%s (%s)' in your _oasis file.")
                        fld where plugin_name (string_of_version min_version)
                        plugin_name
                        plugin_name (string_of_version min_version)
              with Not_found ->
                failwithf
                  (f_ "Field %s in %s is only valid when the OASIS plugin %s is defined.")
                  fld where plugin_name
            in
            version_is_good ~min_version plugin_version_current
              (f_ "Field %s in %s is only valid for the OASIS plugin %s since v%s, update your plugin from '%s (%s)' to '%s (%s)' after checking the plugin's changelog.")
              fld where plugin_name (string_of_version min_version)
              plugin_name (string_of_version plugin_version_current)
              plugin_name (string_of_version min_version)
          with Failure msg ->
            Some msg
        end

    | Section sct, NoneSinceVersion min_version ->
        version_is_good ~min_version data.Data.oasis_version
          (f_ "Section %s is only valid for since OASIS v%s, update OASISFormat field from '%s' to '%s' after checking OASIS changelog.")
          sct (string_of_version min_version)
          (string_of_version data.Data.oasis_version)
          (string_of_version min_version)

    | Section sct, Some(plugin_knd, plugin_name, _),
      SinceVersion min_version ->
        begin
          try
            let plugin_version_current =
              try
                match Data.plugin_version plugin_knd plugin_name data with
                  | Some ver -> ver
                  | None ->
                      failwithf
                        (f_ "Section %s is only valid for the OASIS plugin %s since v%s, but no plugin version is defined in the _oasis file, change '%s' to '%s (%s)' in your _oasis file.")
                        sct plugin_name (string_of_version min_version)
                        plugin_name
                        plugin_name (string_of_version min_version)
              with Not_found ->
                failwithf
                  (f_ "Section %s is only valid when the OASIS plugin %s is defined.")
                  sct plugin_name
            in
            version_is_good ~min_version plugin_version_current
              (f_ "Section %s is only valid for the OASIS plugin %s since v%s, update your plugin from '%s (%s)' to '%s (%s)' after checking the plugin's changelog.")
              sct plugin_name (string_of_version min_version)
              plugin_name (string_of_version plugin_version_current)
              plugin_name (string_of_version min_version)
          with Failure msg ->
            Some msg
        end

    | NoOriginNoneSinceVersion min_version ->
        version_is_good ~min_version data.Data.oasis_version "%s" no_message

    | NoOriginSome(plugin_knd, plugin_name, _), SinceVersion min_version ->
        begin
          try
            let plugin_version_current =
              match Data.plugin_version plugin_knd plugin_name data with
                | Some ver -> ver
                | None -> raise Not_found
            in
            version_is_good ~min_version plugin_version_current
              "%s" no_message
          with Not_found ->
            Some no_message
        end