@@ -2,6 +2,7 @@ use napi::bindgen_prelude::*;
22use napi:: Task ;
33use napi_derive:: napi;
44use std:: fs;
5+ use std:: io:: ErrorKind ;
56use std:: path:: Path ;
67
78#[ napi( object) ]
@@ -25,7 +26,13 @@ fn mkdir_impl(path_str: String, options: Option<MkdirOptions>) -> Result<Option<
2526 if recursive {
2627 // Node.js returns the first directory path created, or undefined if it already existed
2728 if path. exists ( ) {
28- return Ok ( None ) ;
29+ if path. is_dir ( ) {
30+ return Ok ( None ) ;
31+ }
32+ return Err ( Error :: from_reason ( format ! (
33+ "EEXIST: file already exists, mkdir '{}'" ,
34+ path. to_string_lossy( )
35+ ) ) ) ;
2936 }
3037
3138 // Find the first ancestor that doesn't exist
@@ -39,9 +46,7 @@ fn mkdir_impl(path_str: String, options: Option<MkdirOptions>) -> Result<Option<
3946 }
4047 }
4148
42- fs:: create_dir_all ( path) . map_err ( |e| {
43- Error :: from_reason ( format ! ( "ENOENT: no such file or directory, mkdir '{}'" , e) )
44- } ) ?;
49+ fs:: create_dir_all ( path) . map_err ( |e| mkdir_error ( path, e) ) ?;
4550
4651 #[ cfg( unix) ]
4752 {
@@ -54,21 +59,7 @@ fn mkdir_impl(path_str: String, options: Option<MkdirOptions>) -> Result<Option<
5459 let first_created = ancestors. last ( ) . map ( |p| p. to_string_lossy ( ) . to_string ( ) ) ;
5560 Ok ( first_created)
5661 } else {
57- fs:: create_dir ( path) . map_err ( |e| {
58- if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
59- Error :: from_reason ( format ! (
60- "ENOENT: no such file or directory, mkdir '{}'" ,
61- path. to_string_lossy( )
62- ) )
63- } else if e. kind ( ) == std:: io:: ErrorKind :: AlreadyExists {
64- Error :: from_reason ( format ! (
65- "EEXIST: file already exists, mkdir '{}'" ,
66- path. to_string_lossy( )
67- ) )
68- } else {
69- Error :: from_reason ( format ! ( "{}" , e) )
70- }
71- } ) ?;
62+ fs:: create_dir ( path) . map_err ( |e| mkdir_error ( path, e) ) ?;
7263
7364 #[ cfg( unix) ]
7465 {
@@ -80,6 +71,29 @@ fn mkdir_impl(path_str: String, options: Option<MkdirOptions>) -> Result<Option<
8071 }
8172}
8273
74+ fn mkdir_error ( path : & Path , err : std:: io:: Error ) -> Error {
75+ let path_display = path. to_string_lossy ( ) ;
76+ match err. kind ( ) {
77+ ErrorKind :: NotFound => Error :: from_reason ( format ! (
78+ "ENOENT: no such file or directory, mkdir '{}'" ,
79+ path_display
80+ ) ) ,
81+ ErrorKind :: AlreadyExists => Error :: from_reason ( format ! (
82+ "EEXIST: file already exists, mkdir '{}'" ,
83+ path_display
84+ ) ) ,
85+ ErrorKind :: PermissionDenied => Error :: from_reason ( format ! (
86+ "EACCES: permission denied, mkdir '{}'" ,
87+ path_display
88+ ) ) ,
89+ ErrorKind :: NotADirectory => Error :: from_reason ( format ! (
90+ "ENOTDIR: not a directory, mkdir '{}'" ,
91+ path_display
92+ ) ) ,
93+ _ => Error :: from_reason ( format ! ( "{}, mkdir '{}'" , err, path_display) ) ,
94+ }
95+ }
96+
8397#[ napi( js_name = "mkdirSync" ) ]
8498pub fn mkdir_sync ( path : String , options : Option < MkdirOptions > ) -> Result < Option < String > > {
8599 mkdir_impl ( path, options)
0 commit comments