Skip to content

Commit 1a3ed22

Browse files
ThinkerDreamerpaolobarbolini
authored andcommitted
fix!: don't allow idents as assets dir or ignore dirs
1 parent 7532526 commit 1a3ed22

File tree

1 file changed

+10
-40
lines changed

1 file changed

+10
-40
lines changed

static-serve-macro/src/lib.rs

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
55
use std::{
66
convert::Into,
7-
fmt::Display,
87
fs,
98
io::{self, Write},
109
path::{Path, PathBuf},
@@ -109,13 +108,13 @@ impl ToTokens for EmbedAssets {
109108
}
110109
}
111110

112-
struct AssetsDir(ValidAssetsDirTypes);
111+
struct AssetsDir(LitStr);
113112

114113
impl Parse for AssetsDir {
115114
fn parse(input: ParseStream) -> syn::Result<Self> {
116115
let input_span = input.span();
117-
let assets_dir: ValidAssetsDirTypes = input.parse()?;
118-
let literal = assets_dir.to_string();
116+
let assets_dir: LitStr = input.parse()?;
117+
let literal = assets_dir.value();
119118
let path = Path::new(&literal);
120119
let metadata = match fs::metadata(path) {
121120
Ok(meta) => meta,
@@ -147,36 +146,6 @@ impl Parse for AssetsDir {
147146
}
148147
}
149148

150-
enum ValidAssetsDirTypes {
151-
LiteralStr(LitStr),
152-
Ident(Ident),
153-
}
154-
155-
impl Display for ValidAssetsDirTypes {
156-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
157-
match self {
158-
Self::LiteralStr(inner) => write!(f, "{}", inner.value()),
159-
Self::Ident(inner) => write!(f, "{inner}"),
160-
}
161-
}
162-
}
163-
164-
impl Parse for ValidAssetsDirTypes {
165-
fn parse(input: ParseStream) -> syn::Result<Self> {
166-
if let Ok(inner) = input.parse::<LitStr>() {
167-
Ok(ValidAssetsDirTypes::LiteralStr(inner))
168-
} else {
169-
let inner = input.parse::<Ident>().map_err(|_| {
170-
syn::Error::new(
171-
input.span(),
172-
"Assets directory must be a literal string or valid identifier",
173-
)
174-
})?;
175-
Ok(ValidAssetsDirTypes::Ident(inner))
176-
}
177-
}
178-
}
179-
180149
struct IgnoreDirs(Vec<PathBuf>);
181150

182151
struct IgnoreDirsWithSpan(Vec<(PathBuf, Span)>);
@@ -190,11 +159,12 @@ impl Parse for IgnoreDirsWithSpan {
190159
while !inner_content.is_empty() {
191160
let directory_span = inner_content.span();
192161
let directory_str = inner_content.parse::<LitStr>()?;
162+
let path = PathBuf::from(directory_str.value());
163+
dirs.push((path, directory_span));
164+
193165
if !inner_content.is_empty() {
194166
inner_content.parse::<Token![,]>()?;
195167
}
196-
let path = PathBuf::from(directory_str.value());
197-
dirs.push((path, directory_span));
198168
}
199169

200170
Ok(IgnoreDirsWithSpan(dirs))
@@ -203,11 +173,11 @@ impl Parse for IgnoreDirsWithSpan {
203173

204174
fn validate_ignore_dirs(
205175
ignore_dirs: IgnoreDirsWithSpan,
206-
assets_dir: &ValidAssetsDirTypes,
176+
assets_dir: &LitStr,
207177
) -> syn::Result<IgnoreDirs> {
208178
let mut valid_ignore_dirs = Vec::new();
209179
for (dir, span) in ignore_dirs.0 {
210-
let full_path = PathBuf::from(assets_dir.to_string()).join(&dir);
180+
let full_path = PathBuf::from(assets_dir.value()).join(&dir);
211181
match fs::metadata(&full_path) {
212182
Ok(meta) if !meta.is_dir() => {
213183
return Err(syn::Error::new(
@@ -247,11 +217,11 @@ impl Parse for ShouldCompress {
247217
}
248218

249219
fn generate_static_routes(
250-
assets_dir: &ValidAssetsDirTypes,
220+
assets_dir: &LitStr,
251221
ignore_dirs: &IgnoreDirs,
252222
should_compress: &LitBool,
253223
) -> Result<TokenStream, error::Error> {
254-
let assets_dir_abs = Path::new(&assets_dir.to_string())
224+
let assets_dir_abs = Path::new(&assets_dir.value())
255225
.canonicalize()
256226
.map_err(Error::CannotCanonicalizeDirectory)?;
257227
let assets_dir_abs_str = assets_dir_abs

0 commit comments

Comments
 (0)