Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
Actor Framework
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cpp-libs
Actor Framework
Commits
4b4d3fcb
Commit
4b4d3fcb
authored
Jun 20, 2023
by
Samir Halilcevic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Integrate review feedback
parent
9fe1e9f4
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
69 additions
and
49 deletions
+69
-49
CHANGELOG.md
CHANGELOG.md
+2
-0
libcaf_core/caf/config_option.hpp
libcaf_core/caf/config_option.hpp
+19
-9
libcaf_core/src/actor_system_config.cpp
libcaf_core/src/actor_system_config.cpp
+4
-8
libcaf_core/src/config_option.cpp
libcaf_core/src/config_option.cpp
+11
-12
libcaf_core/test/actor_system_config.cpp
libcaf_core/test/actor_system_config.cpp
+0
-15
libcaf_core/test/config_option.cpp
libcaf_core/test/config_option.cpp
+4
-4
libcaf_core/test/config_option_set.cpp
libcaf_core/test/config_option_set.cpp
+1
-1
robot/CMakeLists.txt
robot/CMakeLists.txt
+8
-0
robot/config/read-config-file.robot
robot/config/read-config-file.robot
+20
-0
No files found.
CHANGELOG.md
View file @
4b4d3fcb
...
...
@@ -23,6 +23,8 @@ is based on [Keep a Changelog](https://keepachangelog.com).
-
The output of
`--dump-config`
now only contains CAF options from loaded
modules. Previously, it also included options from modules that were not
loaded.
-
The CLI argument format now supports a space separator when using long
argument names (e.g.
`--foo bar`
)
### Fixed
...
...
libcaf_core/caf/config_option.hpp
View file @
4b4d3fcb
...
...
@@ -19,6 +19,21 @@ namespace caf {
class
CAF_CORE_EXPORT
config_option
{
public:
// -- member types -----------------------------------------------------------
/// An iterator over CLI arguments.
using
argument_iterator
=
std
::
vector
<
std
::
string
>::
const_iterator
;
/// Stores the result of a find operation. The option sets `begin == end`
/// if the operation could not find a match.
struct
find_result
{
/// The begin of the matched range.
argument_iterator
begin
;
/// The end of the matched range.
argument_iterator
end
;
/// The value for the config option.
std
::
string_view
value
;
};
/// Custom vtable-like struct for delegating to type-specific functions and
/// storing type-specific information shared by several config options.
...
...
@@ -92,6 +107,10 @@ public:
/// Returns whether the category is optional for CLI options.
bool
has_flat_cli_name
()
const
noexcept
;
/// Tries to find this option by its long name in `[first, last)`.
find_result
find_by_long_name
(
argument_iterator
first
,
argument_iterator
last
)
const
noexcept
;
private:
std
::
string_view
buf_slice
(
size_t
from
,
size_t
to
)
const
noexcept
;
...
...
@@ -104,13 +123,4 @@ private:
mutable
void
*
value_
;
};
/// Finds `config_option` string with a matching long name in the argument list
/// [`first`, `last`). Returns an `iterator` to the matching location and a
/// `string_view` of the option value if the entry is found, or a `iterator`
/// to `last` with an empty `string_view` otherwise.
std
::
pair
<
std
::
vector
<
std
::
string
>::
const_iterator
,
std
::
string_view
>
find_by_long_name
(
const
config_option
&
x
,
std
::
vector
<
std
::
string
>::
const_iterator
first
,
std
::
vector
<
std
::
string
>::
const_iterator
last
);
}
// namespace caf
libcaf_core/src/actor_system_config.cpp
View file @
4b4d3fcb
...
...
@@ -462,19 +462,15 @@ std::pair<error, std::string>
actor_system_config
::
extract_config_file_path
(
string_list
&
args
)
{
auto
ptr
=
custom_options_
.
qualified_name_lookup
(
"global.config-file"
);
CAF_ASSERT
(
ptr
!=
nullptr
);
auto
[
i
,
path
]
=
find_by_long_name
(
*
ptr
,
args
.
begin
(),
args
.
end
());
if
(
i
==
args
.
end
())
{
auto
[
first
,
last
,
path
]
=
ptr
->
find_by_long_name
(
args
.
begin
(),
args
.
end
());
if
(
first
==
args
.
end
())
{
return
{
none
,
std
::
string
{}};
}
else
if
(
path
.
empty
())
{
return
{
make_error
(
pec
::
missing_argument
,
"no argument to --config-file"
),
std
::
string
{}};
}
else
{
auto
path_str
=
std
::
string
{
path
.
begin
(),
path
.
end
()};
if
(
i
->
find
(
'='
)
!=
std
::
string
::
npos
)
{
args
.
erase
(
i
);
}
else
{
args
.
erase
(
i
,
i
+
2
);
}
auto
path_str
=
std
::
string
{
path
};
args
.
erase
(
first
,
last
);
config_value
val
{
path_str
};
if
(
auto
err
=
ptr
->
sync
(
val
);
!
err
)
{
put
(
content
,
"config-file"
,
std
::
move
(
val
));
...
...
libcaf_core/src/config_option.cpp
View file @
4b4d3fcb
...
...
@@ -134,11 +134,10 @@ std::string_view config_option::buf_slice(size_t from,
}
// TODO: consider using `config_option_set` and deprecating this
std
::
pair
<
std
::
vector
<
std
::
string
>::
const_iterator
,
std
::
string_view
>
find_by_long_name
(
const
config_option
&
x
,
std
::
vector
<
std
::
string
>::
const_iterator
first
,
std
::
vector
<
std
::
string
>::
const_iterator
last
)
{
auto
long_name
=
x
.
long_name
();
config_option
::
find_result
config_option
::
find_by_long_name
(
config_option
::
argument_iterator
first
,
config_option
::
argument_iterator
last
)
const
noexcept
{
auto
argument_name
=
long_name
();
for
(;
first
!=
last
;
++
first
)
{
std
::
string_view
str
{
*
first
};
// Make sure this is a long option starting with "--".
...
...
@@ -146,24 +145,24 @@ find_by_long_name(const config_option& x,
continue
;
str
.
remove_prefix
(
2
);
// Make sure we are dealing with the right key.
if
(
!
starts_with
(
str
,
long
_name
))
if
(
!
starts_with
(
str
,
argument
_name
))
continue
;
str
.
remove_prefix
(
long
_name
.
size
());
str
.
remove_prefix
(
argument
_name
.
size
());
// check for flag
if
(
x
.
is_flag
()
&&
str
.
empty
())
{
return
{
first
,
str
};
if
(
is_flag
()
&&
str
.
empty
())
{
return
{
first
,
first
+
1
,
str
};
}
else
if
(
starts_with
(
str
,
"="
))
{
// Remove leading '=' and return the value.
str
.
remove_prefix
(
1
);
return
{
first
,
str
};
return
{
first
,
first
+
1
,
str
};
}
else
if
(
auto
val
=
first
+
1
;
str
.
empty
()
&&
val
!=
last
)
{
// Get the next argument the value
return
{
first
,
std
::
string_view
{
*
val
}};
return
{
first
,
first
+
2
,
std
::
string_view
{
*
val
}};
}
else
{
continue
;
}
}
return
{
first
,
std
::
string_view
{}};
return
{
first
,
first
,
std
::
string_view
{}};
}
}
// namespace caf
libcaf_core/test/actor_system_config.cpp
View file @
4b4d3fcb
...
...
@@ -149,21 +149,6 @@ CAF_TEST(file input overrides defaults but CLI args always win) {
CHECK_EQ
(
content
(
cfg
),
res
);
}
CAF_TEST
(
parsing
-
with
config
file
cli
option
)
{
MESSAGE
(
"Try opening non-existent config file"
);
cfg
.
clear
();
auto
err
=
cfg
.
parse
(
string_list
{
"--config-file=test-me"
});
CHECK_EQ
(
err
,
caf
::
sec
::
cannot_open_file
);
CHECK
(
cfg
.
remainder
.
empty
());
CHECK_EQ
(
get_or
(
cfg
,
"config-file"
,
""
),
"test-me"
);
cfg
.
clear
();
err
=
cfg
.
parse
(
string_list
{
"--config-file"
,
"test-me"
});
CHECK_EQ
(
err
,
caf
::
sec
::
cannot_open_file
);
CHECK
(
cfg
.
remainder
.
empty
());
CHECK_EQ
(
get_or
(
cfg
,
"config-file"
,
""
),
"test-me"
);
}
// Checks whether both a synced variable and the corresponding entry in
// content(cfg) are equal to `value`.
#define CHECK_SYNCED(var, ...) \
...
...
libcaf_core/test/config_option.cpp
View file @
4b4d3fcb
...
...
@@ -343,12 +343,12 @@ CAF_TEST(find by long opt) {
auto
needle
=
make_config_option
<
std
::
string
>
(
"?foo"
sv
,
"bar,b"
sv
,
"test option"
sv
);
auto
check
=
[
&
](
std
::
vector
<
string
>
args
,
bool
found_opt
,
bool
has_opt
)
{
auto
res
=
find_by_long_name
(
needle
,
std
::
begin
(
args
),
std
::
end
(
args
));
CHECK_EQ
(
res
.
first
!=
std
::
end
(
args
),
found_opt
);
auto
res
=
needle
.
find_by_long_name
(
std
::
begin
(
args
),
std
::
end
(
args
));
CHECK_EQ
(
res
.
begin
!=
std
::
end
(
args
),
found_opt
);
if
(
has_opt
)
CHECK_EQ
(
res
.
second
,
"val2"
);
CHECK_EQ
(
res
.
value
,
"val2"
);
else
CHECK
(
res
.
second
.
empty
());
CHECK
(
res
.
value
.
empty
());
};
// Well formed, find val2.
check
({
"--foo=val1"
,
"--bar=val2"
,
"--baz=val3"
},
true
,
true
);
...
...
libcaf_core/test/config_option_set.cpp
View file @
4b4d3fcb
...
...
@@ -109,7 +109,7 @@ CAF_TEST(parse with ref syncing) {
CHECK_EQ
(
get_as
<
int
>
(
cfg
,
"foo.i"
),
42
);
}
CAF_TEST
(
L
ong
format
for
flags
)
{
CAF_TEST
(
l
ong
format
for
flags
)
{
auto
foo_b
=
false
;
opts
.
add
<
bool
>
(
foo_b
,
"foo"
,
"b,b"
,
""
);
settings
cfg
;
...
...
robot/CMakeLists.txt
View file @
4b4d3fcb
find_package
(
Python COMPONENTS Interpreter
)
add_test
(
NAME
"robot-config-read-config-file"
COMMAND
${
Python_EXECUTABLE
}
-m robot
--variable BINARY_PATH:$<TARGET_FILE:hello_world>
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/config/read-config-file.robot"
)
add_test
(
NAME
"robot-config-dump-config"
COMMAND
...
...
robot/config/read-config-file.robot
0 → 100644
View file @
4b4d3fcb
*** Settings ***
Documentation
A test suite for --config-file.
Library
OperatingSystem
Library
Process
*** Variables ***
${BINARY_PATH}
/path/to/the/test/binary
*** Test Cases ***
Test --config-file argument
[
Documentation
]
Binary with a --config-file option tries to open the provided file.
[
Tags
]
Config
Run Process
${BINARY_PATH}
--config-file\=test-me.cfg
stderr=output
${error_output}
=
Get File
output
Should Contain
${error_output}
cannot_open_file("test-me.cfg")
Run Process
${BINARY_PATH}
--config-file
test-me.cfg
stderr=output
${error_output}
=
Get File
output
Should Contain
${error_output}
cannot_open_file("test-me.cfg")
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment