@@ -11,34 +11,51 @@ using v8::NewStringType;
11
11
using v8::Object;
12
12
using v8::String;
13
13
14
- std::vector<std::string > Dotenv::GetPathFromArgs (
14
+ std::vector<Dotenv::EnvFileData > Dotenv::GetEnvFileDataFromArgs (
15
15
const std::vector<std::string>& args) {
16
+ const std::string_view env_file_flag = " --env-file" ;
17
+
16
18
const auto find_match = [](const std::string& arg) {
17
- const std::string_view flag = " --env-file" ;
18
- return strncmp (arg.c_str (), flag.data (), flag.size ()) == 0 ;
19
+ const std::string_view env_file_flag = " --env-file" ;
20
+ const std::string_view optional_env_file_flag = " --optional-env-file" ;
21
+ return strncmp (arg.c_str (), env_file_flag.data (), env_file_flag.size ()) == 0 ||
22
+ strncmp (arg.c_str (),
23
+ optional_env_file_flag.data (),
24
+ optional_env_file_flag.size ()) == 0 ;
19
25
};
20
- std::vector<std::string> paths;
21
- auto path = std::find_if (args.begin (), args.end (), find_match);
22
26
23
- while (path != args.end ()) {
24
- auto equal_char = path->find (' =' );
27
+ std::vector<Dotenv::EnvFileData> env_files;
28
+ // This will be an iterator, pointing to args.end() if no matches are found
29
+ auto matched_arg = std::find_if (args.begin (), args.end (), find_match);
30
+
31
+ while (matched_arg != args.end ()) {
32
+ auto equal_char = matched_arg->find (' =' );
25
33
26
34
if (equal_char != std::string::npos) {
27
- paths.push_back (path->substr (equal_char + 1 ));
35
+ auto flag = matched_arg->substr (0 , equal_char);
36
+ struct EnvFileData env_file_data = {
37
+ matched_arg->substr (equal_char + 1 ),
38
+ strncmp (flag.c_str (), env_file_flag.data (), env_file_flag.size ()) == 0
39
+ };
40
+ env_files.push_back (env_file_data);
28
41
} else {
29
- auto next_path = std::next (path );
42
+ auto file_path = std::next (matched_arg );
30
43
31
- if (next_path == args.end ()) {
32
- return paths ;
44
+ if (file_path == args.end ()) {
45
+ return env_files ;
33
46
}
34
47
35
- paths.push_back (*next_path);
48
+ struct EnvFileData env_file_data = {
49
+ *file_path,
50
+ strncmp (matched_arg->c_str (), env_file_flag.data (), env_file_flag.size ()) == 0
51
+ };
52
+ env_files.push_back (env_file_data);
36
53
}
37
54
38
- path = std::find_if (++path , args.end (), find_match);
55
+ matched_arg = std::find_if (++matched_arg , args.end (), find_match);
39
56
}
40
57
41
- return paths ;
58
+ return env_files ;
42
59
}
43
60
44
61
void Dotenv::SetEnvironment (node::Environment* env) {
0 commit comments