presets: allow unbalanced quotes

This commit is contained in:
chyyran 2023-02-23 23:57:20 -05:00
parent 31235971db
commit b4b22237e2
3 changed files with 27 additions and 559 deletions

View file

@ -1,3 +1,4 @@
use std::ops::RangeFrom;
use crate::error::ParsePresetError;
use crate::parse::Span;
use nom::branch::alt;
@ -8,10 +9,7 @@ use nom::combinator::{eof, map_res, value};
use nom::error::{ErrorKind, ParseError};
use nom::sequence::delimited;
use nom::{
bytes::complete::tag, character::complete::multispace0, IResult, InputIter, InputLength,
InputTake,
};
use nom::{bytes::complete::tag, character::complete::multispace0, IResult, InputIter, InputLength, InputTake, Parser, Slice, AsChar};
#[derive(Debug)]
pub struct Token<'a> {
@ -52,9 +50,23 @@ fn parse_assignment(input: Span) -> IResult<Span, ()> {
Ok((input, ()))
}
fn unbalanced_quote<I>(input: I) -> IResult<I, ()>
where I: Slice<RangeFrom<usize>> + InputIter + InputLength,
<I as InputIter>::Item: AsChar,
I: Copy
{
if let Ok((input, _)) = eof::<_, ()>(input) {
Ok((input, ()))
} else {
let (input, _) = char('"')(input)?;
Ok((input, ()))
}
}
fn extract_from_quotes(input: Span) -> IResult<Span, Span> {
let (input, between) = delimited(char('"'), is_not("\""), char('"'))(input)?;
let (input, _) = whitespace(input)?;
// Allow unbalanced quotes because some presets just leave an open quote.
let (input, between) = delimited(char('"'), is_not("\""), unbalanced_quote)(input)?;
let (input, _) = opt_whitespace(input)?;
let (input, _) = eof(input)?;
Ok((input, between))
}
@ -71,7 +83,7 @@ fn single_comment(i: Span) -> IResult<Span, Span> {
)(i)
}
fn whitespace(i: Span) -> IResult<Span, ()> {
fn opt_whitespace(i: Span) -> IResult<Span, ()> {
value(
(), // Output is thrown away.
multispace0,
@ -108,7 +120,7 @@ fn parse_tokens(mut span: Span) -> IResult<Span, Vec<Token>> {
let mut values = Vec::new();
while !span.is_empty() {
// important to munch whitespace first.
if let Ok((input, _)) = whitespace(span) {
if let Ok((input, _)) = opt_whitespace(span) {
span = input;
}
// handle references before comments because comments can start with #
@ -163,549 +175,4 @@ mod test {
single_comment("// Define textures to be used by the different passes\ntetx=n".into());
eprintln!("{parsed:?}")
}
#[test]
fn parses_key_value_line() {
let parsed = do_lex(TEST3);
eprintln!("{parsed:#?}")
}
// todo: fix
const TEST2: &str = r#"
// Color Correction with Dogway's awesome Grade shader
// Grade is after Afterglow so that brightening the black level does not break the afterglow
shader9 = ../../shaders/dogway/hsm-grade.slang
"#;
const TEST: &str = r#"
#reference "../../alt"
shaders = 54
shader0 = ../../shaders/base/add-params-all.slang
alias0 = "CorePass" # hello
shader1 = ../../shaders/hyllian/cubic/hsm-drez-b-spline-x.slang
filter_linear1 = false
scale_type_x1 = absolute
scale_x1 = 640
scale_type_y1 = viewport
scaley0 = 1.0
wrap_mode1 = "clamp_to_edge"
shader2 = ../../shaders/hyllian/cubic/hsm-drez-b-spline-y.slang
filter_linear2 = false
scale_type2 = absolute
scale_x2 = 640
scale_y2 = 480
wrap_mode2 = "clamp_to_edge"
alias2 = "DerezedPass"
shader3 = ../../shaders/base/add-negative-crop-area.slang
filter_linear3 = false
mipmap_input3 = false
srgb_framebuffer3 = true
scale_type3 = source
scale_x3 = 1
scale_y3 = 1
alias3 = "NegativeCropAddedPass"
shader4 = ../../shaders/base/cache-info-all-params.slang
filter_linear4 = false
scale_type4 = source
scale4 = 1.0
alias4 = "InfoCachePass"
shader5 = ../../shaders/base/text-std.slang
filter_linear5 = false
float_framebuffer5 = true
scale_type5 = source
scale5 = 1.0
alias5 = "TextPass"
shader6 = ../../shaders/base/intro.slang
filter_linear6 = false
float_framebuffer6 = true
scale_type6 = source
scale6 = 1.0
alias6 = "IntroPass"
shader7 = ../../shaders/dedither/dedither-gamma-prep-1-before.slang
alias7 = LinearGamma
shader8 = ../../shaders/hyllian/checkerboard-dedither/checkerboard-dedither-pass1.slang
shader9 = ../../shaders/hyllian/checkerboard-dedither/checkerboard-dedither-pass2.slang
shader10 = ../../shaders/hyllian/checkerboard-dedither/checkerboard-dedither-pass3.slang
alias10 = "PreMdaptPass"
// De-Dithering - Mdapt
shader11 = ../../shaders/mdapt/hsm-mdapt-pass0.slang
shader12 = ../../shaders/mdapt/hsm-mdapt-pass1.slang
shader13 = ../../shaders/mdapt/hsm-mdapt-pass2.slang
shader14 = ../../shaders/mdapt/hsm-mdapt-pass3.slang
shader15 = ../../shaders/mdapt/hsm-mdapt-pass4.slang
shader16 = ../../shaders/dedither/dedither-gamma-prep-2-after.slang
shader17 = ../../shaders/ps1dither/hsm-PS1-Undither-BoxBlur.slang
shader18 = ../../shaders/guest/extras/hsm-sharpsmoother.slang
shader19 = ../../shaders/base/stock.slang
alias19 = refpass
shader20 = ../../shaders/scalefx/hsm-scalefx-pass0.slang
filter_linear20 = false
scale_type20 = source
scale20 = 1.0
float_framebuffer20 = true
alias20 = scalefx_pass0
shader21 = ../../shaders/scalefx/hsm-scalefx-pass1.slang
filter_linear21 = false
scale_type21 = source
scale21 = 1.0
float_framebuffer12 = true
shader22 = ../../shaders/scalefx/hsm-scalefx-pass2.slang
filter_linear22 = false
scale_type22 = source
scale22 = 1.0
shader23 = ../../shaders/scalefx/hsm-scalefx-pass3.slang
filter_linear23 = false
scale_type23 = source
scale23 = 1.0
shader24 = ../../shaders/scalefx/hsm-scalefx-pass4.slang
filter_linear24 = false
scale_type24 = source
scale24 = 3
shader25 = ../../shaders/base/stock.slang
alias25 = "PreCRTPass"
shader26 = ../../shaders/guest/hsm-afterglow0.slang
filter_linear26 = true
scale_type26 = source
scale26 = 1.0
alias26 = "AfterglowPass"
shader27 = ../../shaders/guest/hsm-pre-shaders-afterglow.slang
filter_linear27 = true
scale_type27 = source
mipmap_input27 = true
scale27 = 1.0
// Color Correction with Dogway's awesome Grade shader
// Grade is after Afterglow so that brightening the black level does not break the afterglow
shader28 = ../../shaders/dogway/hsm-grade.slang
filter_linear28 = true
scale_type28 = source
scale28 = 1.0
shader29 = ../../shaders/base/stock.slang
alias29 = "PrePass0"
shader30 = ../../shaders/guest/ntsc/hsm-ntsc-pass1.slang
filter_linear30 = false
float_framebuffer30 = true
scale_type_x30 = source
scale_type_y30 = source
scale_x30 = 4.0
scale_y30 = 1.0
frame_count_mod30 = 2
alias30 = NPass1
shader31 = ../../shaders/guest/ntsc/hsm-ntsc-pass2.slang
float_framebuffer31 = true
filter_linear31 = true
scale_type31 = source
scale_x31 = 0.5
scale_y31 = 1.0
shader32 = ../../shaders/guest/ntsc/hsm-ntsc-pass3.slang
filter_linear32 = true
scale_type32 = source
scale_x32 = 1.0
scale_y32 = 1.0
shader33 = ../../shaders/guest/hsm-custom-fast-sharpen.slang
filter_linear33 = true
scale_type33 = source
scale_x33 = 1.0
scale_y33 = 1.0
shader34 = ../../shaders/base/stock.slang
filter_linear34 = true
scale_type34 = source
scale_x34 = 1.0
scale_y34 = 1.0
alias34 = "PrePass"
mipmap_input34 = true
shader35 = ../../shaders/guest/hsm-avg-lum.slang
filter_linear35 = true
scale_type35 = source
scale35 = 1.0
mipmap_input35 = true
alias35 = "AvgLumPass"
// Pass referenced by subsequent blurring passes and crt pass
shader36 = ../../shaders/guest/hsm-interlace-and-linearize.slang
filter_linear36 = true
scale_type36 = source
scale36 = 1.0
float_framebuffer36 = true
alias36 = "LinearizePass"
shader37 = ../../shaders/guest/hsm-crt-guest-advanced-ntsc-pass1.slang
filter_linear37 = true
scale_type_x37 = viewport
scale_x37 = 1.0
scale_type_y37 = source
scale_y37 = 1.0
float_framebuffer37 = true
alias37 = Pass1
shader38 = ../../shaders/guest/hsm-gaussian_horizontal.slang
filter_linear38 = true
scale_type_x38 = absolute
scale_x38 = 640.0
scale_type_y38 = source
scale_y38 = 1.0
float_framebuffer38 = true
shader39 = ../../shaders/guest/hsm-gaussian_vertical.slang
filter_linear39 = true
scale_type_x39 = absolute
scale_x39 = 640.0
scale_type_y39 = absolute
scale_y39 = 480.0
float_framebuffer39 = true
alias39 = GlowPass
shader40 = ../../shaders/guest/hsm-bloom_horizontal.slang
filter_linear40 = true
scale_type_x40 = absolute
scale_x40 = 640.0
scale_type_y40 = absolute
scale_y40 = 480.0
float_framebuffer40 = true
shader41 = ../../shaders/guest/hsm-bloom_vertical.slang
filter_linear41 = true
scale_type_x41 = absolute
scale_x41 = 640.0
scale_type_y41 = absolute
scale_y41 = 480.0
float_framebuffer41 = true
alias41 = BloomPass
shader42 = ../../shaders/guest/hsm-crt-guest-advanced-ntsc-pass2.slang
filter_linear42 = true
float_framebuffer42 = true
scale_type42 = viewport
scale_x42 = 1.0
scale_y42 = 1.0
shader43 = ../../shaders/guest/hsm-deconvergence.slang
filter_linear43 = true
scale_type43 = viewport
scale_x43 = 1.0
scale_y43 = 1.0
shader44 = ../../shaders/base/post-crt-prep-image-layers.slang
alias44 = "MBZ_PostCRTPass"
// Reduce Resolution ----------------------------------------------------------------
// Reduce the resolution to a small static size regardless of final resolution
// Allows consistent look and faster at different final resolutions for blur
// Mipmap option allows downscaling without artifacts
shader45 = ../../shaders/base/linearize-crt.slang
mipmap_input45 = true
filter_linear45 = true
scale_type45 = absolute
// scale_x45 = 480
// scale_y45 = 270
// scale_x45 = 960
// scale_y45 = 540
scale_x45 = 800
scale_y45 = 600
alias45 = "BR_MirrorLowResPass"
// Add Blur for the Reflection (Horizontal) ----------------------------------------------------------------
shader46 = ../../shaders/base/blur-outside-screen-horiz.slang
mipmap_input46 = true
filter_linear46 = true
// Add Blur for the Reflection (Vertical) ----------------------------------------------------------------
shader47 = ../../shaders/base/blur-outside-screen-vert.slang
filter_linear47 = true
alias47 = "BR_MirrorBlurredPass"
// Reduce resolution ----------------------------------------------------------------
// Reduced to a very small amount so we can create a blur which will create a glow from the screen
// Mipmap option allows smoother downscaling
shader48 = ../../../../blurs/shaders/royale/blur9x9.slang
mipmap_input48 = true
filter_linear48 = true
scale_type48 = absolute
scale_x48 = 128
scale_y48 = 128
alias48 = "BR_MirrorReflectionDiffusedPass"
// Add Diffused glow all around the screen ----------------------------------------------------------------
// Blurred so much that it's non directional
// Mipmap option allows downscaling without artifacts
shader49 = ../../../../blurs/shaders/royale/blur9x9.slang
mipmap_input49 = true
filter_linear49 = true
scale_type49 = absolute
scale_x49 = 12
scale_y49 = 12
alias49 = "BR_MirrorFullscreenGlowPass"
// Bezel Reflection ----------------------------------------------------------------
shader50 = ../../shaders/base/reflection.slang
scale_type50 = viewport
float_framebuffer50 = true
alias50 = "BR_CRTAndReflectionPass"
// Bezel Generation & Composite of Image Layers ----------------------------------------------------------------
shader51 = ../../shaders/base/bezel-images-under-crt.slang
filter_linear51 = true
scale_type51 = viewport
float_framebuffer51 = true
alias51 = "BR_LayersUnderCRTPass"
shader52 = ../../shaders/base/bezel-images-over-crt.slang
filter_linear52 = true
scale_type52 = viewport
float_framebuffer52 = true
alias52 = "BR_LayersOverCRTPass"
// Combine Passes ----------------------------------------------------------------
shader53 = ../../shaders/base/combine-passes.slang
scale_type53 = viewport
alias53 = "CombinePass"
// Define textures to be used by the different passes
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4;IntroImage;ScreenPlacementImage;TubeDiffuseImage;TubeColoredGelImage;TubeShadowImage;TubeStaticReflectionImage;BackgroundImage;BackgroundVertImage;ReflectionMaskImage;FrameTextureImage;CabinetGlassImage;DeviceImage;DeviceVertImage;DeviceLEDImage;DecalImage;NightLightingImage;NightLighting2Image;LEDImage;TopLayerImage;"
SamplerLUT1 = ../../shaders/guest/lut/trinitron-lut.png
SamplerLUT1_linear = true
SamplerLUT2 = ../../shaders/guest/lut/inv-trinitron-lut.png
SamplerLUT2_linear = true
SamplerLUT3 = ../../shaders/guest/lut/nec-lut.png
SamplerLUT3_linear = true
SamplerLUT4 = ../../shaders/guest/lut/ntsc-lut.png
SamplerLUT4_linear = true
IntroImage = ../../shaders/textures/IntroImage_MegaBezelLogo.png
IntroImage_linear = true
IntroImage_mipmap = 1
ScreenPlacementImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
ScreenPlacementImage_linear = false
TubeDiffuseImage = ../../shaders/textures/Tube_Diffuse_2390x1792.png
TubeDiffuseImage_linear = true
TubeDiffuseImage_mipmap = 1
TubeColoredGelImage = ../../shaders/textures/Colored_Gel_Rainbow.png
TubeColoredGelImage_linear = true
TubeColoredGelImage_mipmap = 1
TubeShadowImage = ../../shaders/textures/Tube_Shadow_1600x1200.png
TubeShadowImage_linear = true
TubeShadowImage_mipmap = 1
TubeStaticReflectionImage = ../../shaders/textures/TubeGlassOverlayImageCropped_1440x1080.png
TubeStaticReflectionImage_linear = true
TubeStaticReflectionImage_mipmap = 1
ReflectionMaskImage = ../../shaders/textures/Placeholder_White_16x16.png
ReflectionMaskImage_linear = true
ReflectionMaskImage_mipmap = 1
FrameTextureImage = ../../shaders/textures/FrameTexture_2800x2120.png
FrameTextureImage_linear = true
FrameTextureImage_mipmap = 1
BackgroundImage = ../../shaders/textures/BackgroundImage_Carbon_3840x2160.png
BackgroundImage_linear = true
BackgroundImage_mipmap = 1
BackgroundVertImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
BackgroundVertImage_linear = true
BackgroundVertImage_mipmap = 1
CabinetGlassImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
CabinetGlassImage_linear = true
CabinetGlassImage_mipmap = 1
DeviceImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
DeviceImage_linear = true
DeviceImage_mipmap = 1
DeviceVertImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
DeviceVertImage_linear = true
DeviceVertImage_mipmap = 1
DeviceLEDImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
DeviceLEDImage_linear = true
DeviceLEDImage_mipmap = 1
DecalImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
DecalImage_linear = true
DecalImage_mipmap = 1
NightLightingImage = ../../shaders/textures/NightLightingClose_1920x1080.png
NightLightingImage_linear = true
NightLightingImage_mipmap = 1
NightLighting2Image = ../../shaders/textures/NightLightingFar_1920x1080.png
NightLighting2Image_linear = true
NightLighting2Image_mipmap = 1
LEDImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
LEDImage_linear = true
LEDImage_mipmap = 1
TopLayerImage = ../../shaders/textures/Placeholder_Transparent_16x16.png
TopLayerImage_linear = true
TopLayerImage_mipmap = 1
// Use for matching vanilla GDV-Advanced
// HSM_ASPECT_RATIO_MODE = 6
// HSM_CURVATURE_MODE = 0
// SMOOTH-ADV
HSM_DEDITHER_MODE = 1
HSM_SCALEFX_ON = 1
HSM_CORE_RES_SAMPLING_MULT_SCANLINE_DIR = 300
HSM_CORE_RES_SAMPLING_MULT_OPPOSITE_DIR = 125
HSM_DOWNSAMPLE_BLUR_SCANLINE_DIR = 0
HSM_DOWNSAMPLE_BLUR_OPPOSITE_DIR = 0
ntsc_scale = 0.4
shadowMask = 3
// NTSC Parameters
GAMMA_INPUT = 2.0
gamma_out = 1.95
// DREZ Parameters
SHARPEN = 0"#;
const TEST3: &str = r#"// DUIMON MEGA BEZEL GRAPHICS AND PRESETS | https://duimon.github.io/Gallery-Guides/ | duimonmb@gmail.com
// SOME RIGHTS RESERVED - RELEASED UNDER CC BY NC ND LICENSE https://creativecommons.org/licenses/by-nc-nd/4.0/deed
// ----------------------------------------------------------------------------------------------------------------
// PRESET START
// ----------------------------------------------------------------------------------------------------------------
// SHADER :: CONNECTOR | Interface to Mega Bezel Presets folders.
// Edit the target file in the following reference to globally define the base preset.
// ----------------------------------------------------------------------------------------------------------------
#reference "../../../zzz_global_params/Base_Shader/ADV_Bezel.slangp"
// SHADER :: CONNECTOR :: LOCAL OVERRIDES | Interface to specific base presets.
// Comment out the top reference line and uncomment the following reference line to locally define the base preset.
// Keep in mind that some of the base presets use Integer Scale and may yield unexpected results. (e.g. Megatron)
//#reference "../../../zzz_global_params/Local_Shader/ADV_06.slangp"
// "ADV_06" matches the default "MBZ__1__ADV__GDV.slangp".
// Replace the "06" with any from the following list.
// 01. SMOOTH-ADV__GDV 08. ADV__GDV-MINI-NTSC
// 02. SMOOTH-ADV__GDV-NTSC 09. ADV__GDV-NTSC
// 03. SMOOTH-ADV__MEGATRON 10. ADV__MEGATRON
// 04. SMOOTH-ADV__MEGATRON-NTSC 11. ADV__MEGATRON-NTSC
// 05. ADV__EASYMODE 12. ADV-RESHADE-FX__GDV
// 06. ADV__GDV 13. ADV-SUPER-XBR__GDV
// 07. ADV__GDV-MINI 14. ADV-SUPER-XBR__GDV-NTSC
// INTRO | Intro animation
// ----------------------------------------------------------------------------------------------------------------
// ON
#reference "../../../zzz_global_params/Intro/on.params"
// ON - No Image
//#reference "../../../zzz_global_params/Intro/on_no_image.params"
// ON - Default Mega Bezel intro
//#reference "../../../zzz_global_params/Intro/on_default.params"
// OFF
//#reference "../../../zzz_global_params/Intro/off.params"
// DEVICE | Screen/Monitor/CRT/TV settings
// ----------------------------------------------------------------------------------------------------------------
// DEVICE :: BASE
#reference "../../../res/bezel/Nintendo_GBA/bezel.params"
// DEVICE :: SCALING
#reference "../../../res/scale/Nintendo_GBA/bezel.params"
// DEVICE :: CRT
#reference "../../../res/crt/Nintendo_GBA/bezel.params"
// IMAGE LAYERS
// ----------------------------------------------------------------------------------------------------------------
#reference "../../../res/layers/Nintendo_GBA/bezel.params"
// HSV :: Hue, Saturation, and Value parameters
// ----------------------------------------------------------------------------------------------------------------
// GRAPHICS OVERRIDES | Overrides for Image layers, scaling, etc
// that are not related to Guest's shader. (Three examples are provided)
// These are intended for [Bezel] versions and the following reference should be left commented out for others.
// ----------------------------------------------------------------------------------------------------------------
// GRAPHICS :: OVERRIDES
//#reference "../../../res/overrides/batocera.params"
//#reference "../../../res/overrides/batocera_nocurve.params"
//#reference "../../../res/overrides/batocera_hud.params"
// GLOBAL GRAPHICS :: OVERRIDES
// The user can edit the "user.params" to globally change the presets.
// These are for the bezel, frame, and other graphic attributes.
// Examples are included in the params file and commented out.
// These are also intended for [Bezel] versions and the following reference should be left commented out for others.
#reference "../../../zzz_global_params/Graphics/user.params"
// The following is restricted to the [Custom-Bezel_002] presets.
// One example is included in the params file and commented out.
//#reference "../../../zzz_global_params/Graphics/user2.params"
// SHADER OVERRIDES | Place *.params references to Guest derivatives here.
// (Make sure you are using ADV__GDV, STD__GDV, or POTATO__GDV base presets for variations on the Guest shader.)
// Two examples were kindly provided by guest.r. ;-)
// ----------------------------------------------------------------------------------------------------------------
// SHADER :: OVERRIDES
//#reference "../../../res/overrides_shader/guest_custom_aperture.params"
//#reference "../../../res/overrides_shader/guest_custom_slotmask.params"
// GLOBAL SHADER :: OVERRIDES
// The user can edit the target params file to globally change the presets.
// To use community params that require another base preset, change the global base reference to match.
// Examples are included in the params file and commented out.
// Separate folders let users change global settings on each of the sets.
// These are intentionally commented out for LCD-GRID presets.
//#reference "../../../zzz_global_params/Shader/ADV/user_Bezel.params"
//#reference "../../../zzz_global_params/Shader/ADV_DREZ/user_Bezel.params"
//#reference "../../../zzz_global_params/Shader/STD/user_Bezel.params"
//#reference "../../../zzz_global_params/Shader/STD_DREZ/user_Bezel.params"
//#reference "../../../zzz_global_params/Shader/LITE/user_Bezel.params"
// AMBIENT LIGHTING
//#reference "../../../res/lighting/night.params"
// PRESET END
// ----------------------------------------------------------------------------------------------------------------
"#;
}

View file

@ -250,6 +250,7 @@ pub fn parse_values(
// load depth first, so all child tokens are first.
// Later tokens take precedence.
all_tokens.push((root_path.as_path(), tokens));
// collect all possible parameter names.
let mut parameter_names: Vec<&str> = Vec::new();
for (_, tokens) in all_tokens.iter_mut() {
@ -529,6 +530,7 @@ pub fn parse_values(
param_val,
));
}
// very last resort, assume undeclared texture (must have extension)
else if Path::new(token.value.fragment()).extension().is_some()
&& ["_mipmap", "_linear", "_wrap_mode", "_repeat_mode"]

View file

@ -3,7 +3,7 @@ use librashader_presets::ShaderPreset;
#[test]
fn parses_all_slang_presets() {
for entry in glob("../test/slang-shaders/**/*.slangp").unwrap() {
for entry in glob("../test/shaders_slang/**/*.slangp").unwrap() {
if let Ok(path) = entry {
if let Err(e) = ShaderPreset::try_parse(&path) {
println!("Could not parse {}: {:?}", path.display(), e)
@ -14,9 +14,8 @@ fn parses_all_slang_presets() {
#[test]
fn parses_problematic() {
for entry in glob("../test/slang-shaders/crt/crt-hyllian-sinc-glow.slangp").unwrap() {
if let Ok(path) = entry {
ShaderPreset::try_parse(&path).expect(&format!("Failed to parse {}", path.display()));
}
}
let path = "../test/Mega_Bezel_Packs/Duimon-Mega-Bezel/Presets/Advanced/Nintendo_NDS_DREZ/NDS-[DREZ]-[Native]-[ADV]-[Guest]-[Night].slangp";
ShaderPreset::try_parse(path)
.expect(&format!("Failed to parse {}", path));
}