mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
Move validate code to separate crate
This commit is contained in:
parent
95f6447108
commit
7998a5aeaa
2
.gitignore
vendored
2
.gitignore
vendored
@ -13,4 +13,4 @@ Cargo.lock
|
||||
# MSVC Windows builds of rustc generate these, which store debugging information
|
||||
*.pdb
|
||||
|
||||
**/test-data
|
||||
**/test-data
|
||||
|
||||
20
Cargo.lock
generated
20
Cargo.lock
generated
@ -1217,17 +1217,17 @@ dependencies = [
|
||||
"log",
|
||||
"lyon",
|
||||
"lyon_path",
|
||||
"naga",
|
||||
"pollster",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"style-spec",
|
||||
"test-env-log",
|
||||
"vector-tile",
|
||||
"walkdir",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
"wgpu",
|
||||
"wgsl-validate",
|
||||
"winit",
|
||||
]
|
||||
|
||||
@ -2021,6 +2021,14 @@ version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
|
||||
|
||||
[[package]]
|
||||
name = "style-spec"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "svgtypes"
|
||||
version = "0.5.0"
|
||||
@ -2411,6 +2419,14 @@ dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgsl-validate"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"naga",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
|
||||
10
Cargo.toml
10
Cargo.toml
@ -4,9 +4,10 @@ version = "0.1.0"
|
||||
authors = ["Maximilian Ammann <max@maxammann.org>"]
|
||||
edition = "2021"
|
||||
resolver = "2"
|
||||
build = "build.rs"
|
||||
|
||||
[features]
|
||||
web-webgl = [ "wgpu/webgl" ]
|
||||
web-webgl = ["wgpu/webgl"]
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
console_error_panic_hook = "0.1"
|
||||
@ -16,7 +17,7 @@ js-sys = "0.3"
|
||||
wasm-bindgen = "0.2"
|
||||
wasm-bindgen-futures = "0.4"
|
||||
console_log = { version = "0.2", features = ["color"] }
|
||||
instant = { version = "0.1", features = [ "stdweb" ] }
|
||||
instant = { version = "0.1", features = ["stdweb"] }
|
||||
|
||||
[dependencies]
|
||||
# Futures
|
||||
@ -25,6 +26,7 @@ pollster = "0.2"
|
||||
|
||||
# Vector riles
|
||||
vector-tile = { path = "libs/vector_tile" }
|
||||
style-spec = { path = "libs/style_spec" }
|
||||
geo = "0.18.0"
|
||||
geo-types = "0.7"
|
||||
# proj = "0.24" FIXME: Incompatible with wasm
|
||||
@ -57,9 +59,7 @@ criterion = "0.3"
|
||||
test-env-log = "0.2"
|
||||
|
||||
[build-dependencies]
|
||||
naga = { version = "0.7", features = ["wgsl-in"] }
|
||||
walkdir = "2.3"
|
||||
|
||||
wgsl-validate = { path = "libs/wgsl_validate" }
|
||||
|
||||
[[bin]]
|
||||
name = "mapr"
|
||||
|
||||
81
build.rs
81
build.rs
@ -1,82 +1,5 @@
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
use std::process::exit;
|
||||
|
||||
use naga::front::wgsl;
|
||||
use naga::valid::{Capabilities, ValidationFlags, Validator};
|
||||
use naga::{front::wgsl::ParseError, valid::ValidationError};
|
||||
use walkdir::WalkDir;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum WgslError {
|
||||
ValidationErr(ValidationError),
|
||||
ParserErr {
|
||||
error: String,
|
||||
line: usize,
|
||||
pos: usize,
|
||||
},
|
||||
IoErr(std::io::Error),
|
||||
}
|
||||
|
||||
impl From<std::io::Error> for WgslError {
|
||||
fn from(err: std::io::Error) -> Self {
|
||||
Self::IoErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl WgslError {
|
||||
pub fn from_parse_err(err: ParseError, src: &str) -> Self {
|
||||
let (line, pos) = err.location(src);
|
||||
let error = err.emit_to_string(src);
|
||||
Self::ParserErr { error, line, pos }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate_wgsl(validator: &mut Validator, path: &Path) -> Result<(), WgslError> {
|
||||
let shader = std::fs::read_to_string(&path).map_err(WgslError::from)?;
|
||||
let module = wgsl::parse_str(&shader).map_err(|err| WgslError::from_parse_err(err, &shader))?;
|
||||
|
||||
if let Err(err) = validator.validate(&module) {
|
||||
Err(WgslError::ValidationErr(err))
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
use wgsl_validate::validate_project_wgsl;
|
||||
|
||||
fn main() {
|
||||
let mut validator = Validator::new(ValidationFlags::all(), Capabilities::all());
|
||||
|
||||
let root_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
let dir_walk = WalkDir::new(&root_dir);
|
||||
let dir_walk = dir_walk.into_iter().filter_entry(|e| {
|
||||
let path = e.path();
|
||||
|
||||
if !path.is_dir() {
|
||||
path.extension().map(|ext| &*ext == "wgsl").unwrap_or(false)
|
||||
} else {
|
||||
true
|
||||
}
|
||||
});
|
||||
|
||||
for entry in dir_walk {
|
||||
match entry {
|
||||
Ok(entry) => {
|
||||
let path = entry.path();
|
||||
if !path.is_dir() {
|
||||
match validate_wgsl(&mut validator, &path) {
|
||||
Ok(_) => {}
|
||||
Err(err) => {
|
||||
let path = path.strip_prefix(&root_dir).unwrap_or(path);
|
||||
println!("cargo:warning=Error ({:?}): {:?}", path, err);
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
println!("cargo:warning=Error: {:?}", err);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
validate_project_wgsl();
|
||||
}
|
||||
|
||||
11
libs/wgsl_validate/Cargo.toml
Normal file
11
libs/wgsl_validate/Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "wgsl-validate"
|
||||
version = "0.1.0"
|
||||
description = "A library for validating WGSL shaders"
|
||||
readme = "README.md"
|
||||
categories = ["encoding"]
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
naga = { version = "0.7", features = ["wgsl-in"] }
|
||||
walkdir = "2.3"
|
||||
84
libs/wgsl_validate/src/lib.rs
Normal file
84
libs/wgsl_validate/src/lib.rs
Normal file
@ -0,0 +1,84 @@
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::path::Path;
|
||||
use std::process::exit;
|
||||
|
||||
use naga::front::wgsl;
|
||||
use naga::valid::{Capabilities, ValidationFlags, Validator};
|
||||
use naga::{front::wgsl::ParseError, valid::ValidationError};
|
||||
use walkdir::WalkDir;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum WgslError {
|
||||
ValidationErr(ValidationError),
|
||||
ParserErr {
|
||||
error: String,
|
||||
line: usize,
|
||||
pos: usize,
|
||||
},
|
||||
IoErr(std::io::Error),
|
||||
}
|
||||
|
||||
impl From<std::io::Error> for WgslError {
|
||||
fn from(err: std::io::Error) -> Self {
|
||||
Self::IoErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl WgslError {
|
||||
pub fn from_parse_err(err: ParseError, src: &str) -> Self {
|
||||
let (line, pos) = err.location(src);
|
||||
let error = err.emit_to_string(src);
|
||||
Self::ParserErr { error, line, pos }
|
||||
}
|
||||
}
|
||||
|
||||
fn validate_wgsl(validator: &mut Validator, path: &Path) -> Result<(), WgslError> {
|
||||
let shader = std::fs::read_to_string(&path).map_err(WgslError::from)?;
|
||||
let module = wgsl::parse_str(&shader).map_err(|err| WgslError::from_parse_err(err, &shader))?;
|
||||
|
||||
if let Err(err) = validator.validate(&module) {
|
||||
Err(WgslError::ValidationErr(err))
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate_project_wgsl() {
|
||||
let mut validator = Validator::new(ValidationFlags::all(), Capabilities::all());
|
||||
|
||||
let root_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
let dir_walk = WalkDir::new(&root_dir);
|
||||
let dir_walk = dir_walk.into_iter().filter_entry(|e| {
|
||||
let path = e.path();
|
||||
|
||||
if !path.is_dir() {
|
||||
path.extension().map(|ext| &*ext == "wgsl").unwrap_or(false)
|
||||
} else {
|
||||
true
|
||||
}
|
||||
});
|
||||
|
||||
for entry in dir_walk {
|
||||
match entry {
|
||||
Ok(entry) => {
|
||||
let path = entry.path();
|
||||
if !path.is_dir() {
|
||||
match validate_wgsl(&mut validator, &path) {
|
||||
Ok(_) => {}
|
||||
Err(err) => {
|
||||
let path = path.strip_prefix(&root_dir).unwrap_or(path);
|
||||
println!("cargo:warning=Error ({:?}): {:?}", path, err);
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
println!("cargo:warning=Error: {:?}", err);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user