use super::config::JsModelConfig;
use crate::validation::{ConfigValidator, NameValidator, ValidationError, VersionValidator};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct JsValidationError {
inner: ValidationError,
}
#[wasm_bindgen]
impl JsValidationError {
#[wasm_bindgen(constructor)]
pub fn new(field: &str, message: &str) -> Self {
Self {
inner: ValidationError::new(field.to_string(), message.to_string()),
}
}
#[wasm_bindgen(getter)]
pub fn field(&self) -> String {
self.inner.field.clone()
}
#[wasm_bindgen(getter)]
pub fn message(&self) -> String {
self.inner.message.clone()
}
#[wasm_bindgen(js_name = toString)]
pub fn to_string_js(&self) -> String {
format!("{}: {}", self.inner.field, self.inner.message)
}
}
impl JsValidationError {
pub(crate) fn from_inner(inner: ValidationError) -> Self {
Self { inner }
}
}
#[wasm_bindgen]
pub struct JsNameValidator;
#[wasm_bindgen]
impl JsNameValidator {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self
}
#[wasm_bindgen]
pub fn validate(&self, config: &JsModelConfig) -> Vec<JsValidationError> {
let validator = NameValidator;
match validator.validate(config.inner()) {
Ok(()) => Vec::new(),
Err(errors) => errors
.into_iter()
.map(JsValidationError::from_inner)
.collect(),
}
}
}
impl Default for JsNameValidator {
fn default() -> Self {
Self::new()
}
}
#[wasm_bindgen]
pub struct JsVersionValidator;
#[wasm_bindgen]
impl JsVersionValidator {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self
}
#[wasm_bindgen]
pub fn validate(&self, config: &JsModelConfig) -> Vec<JsValidationError> {
let validator = VersionValidator;
match validator.validate(config.inner()) {
Ok(()) => Vec::new(),
Err(errors) => errors
.into_iter()
.map(JsValidationError::from_inner)
.collect(),
}
}
}
impl Default for JsVersionValidator {
fn default() -> Self {
Self::new()
}
}
#[wasm_bindgen]
pub struct JsCompositeValidator {
use_name: bool,
use_version: bool,
}
#[wasm_bindgen]
impl JsCompositeValidator {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self {
use_name: false,
use_version: false,
}
}
#[wasm_bindgen(js_name = withNameValidator)]
pub fn with_name_validator(&self) -> JsCompositeValidator {
Self {
use_name: true,
use_version: self.use_version,
}
}
#[wasm_bindgen(js_name = withVersionValidator)]
pub fn with_version_validator(&self) -> JsCompositeValidator {
Self {
use_name: self.use_name,
use_version: true,
}
}
#[wasm_bindgen]
pub fn validate(&self, config: &JsModelConfig) -> Vec<JsValidationError> {
let mut errors = Vec::new();
if self.use_name {
let validator = NameValidator;
if let Err(errs) = validator.validate(config.inner()) {
errors.extend(errs.into_iter().map(JsValidationError::from_inner));
}
}
if self.use_version {
let validator = VersionValidator;
if let Err(errs) = validator.validate(config.inner()) {
errors.extend(errs.into_iter().map(JsValidationError::from_inner));
}
}
errors
}
}
impl Default for JsCompositeValidator {
fn default() -> Self {
Self::new()
}
}