Skip to content

Commit 51f1a01

Browse files
committed
feat(string): get_json_value real mold/result
1 parent 3b1d30e commit 51f1a01

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

src/sourcery/sourcery_string_m.f90

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ module sourcery_string_m
1414
generic :: string => as_character
1515
procedure :: is_allocated
1616
procedure :: get_json_key
17+
procedure :: get_json_real_value
1718
procedure :: get_json_string_value
1819
procedure :: get_json_logical_value
1920
procedure :: get_json_integer_value
2021
procedure :: get_json_integer_array_value
2122
generic :: get_json_value => &
22-
get_json_string_value, get_json_logical_value, get_json_integer_array_value, get_json_integer_value
23+
get_json_string_value, get_json_logical_value, get_json_integer_array_value, get_json_integer_value, get_json_real_value
2324
procedure :: equivalent
2425
generic :: operator(==) => equivalent
2526
end type
@@ -60,6 +61,13 @@ elemental module function get_json_key(self) result(unquoted_key)
6061
type(string_t) unquoted_key
6162
end function
6263

64+
elemental module function get_json_real_value(self, key, mold) result(value_)
65+
implicit none
66+
class(string_t), intent(in) :: self, key
67+
real, intent(in) :: mold
68+
real value_
69+
end function
70+
6371
elemental module function get_json_string_value(self, key, mold) result(value_)
6472
implicit none
6573
class(string_t), intent(in) :: self, key, mold

src/sourcery/sourcery_string_s.f90

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,25 @@
5151

5252
end procedure
5353

54+
module procedure get_json_real_value
55+
character(len=:), allocatable :: raw_line, string_value
56+
57+
call assert(key==self%get_json_key(), "string_s(get_json_real_value): key==self%get_json_key()", key)
58+
59+
raw_line = self%string()
60+
associate(text_after_colon => raw_line(index(raw_line, ':')+1:))
61+
associate(trailing_comma => index(text_after_colon, ','))
62+
if (trailing_comma == 0) then
63+
string_value = trim(adjustl((text_after_colon)))
64+
else
65+
string_value = trim(adjustl((text_after_colon(:trailing_comma-1))))
66+
end if
67+
read(string_value, fmt=*) value_
68+
end associate
69+
end associate
70+
71+
end procedure
72+
5473
module procedure get_json_string_value
5574

5675
character(len=:), allocatable :: raw_line

test/string_test.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function results() result(test_results)
2525
test_results = [ &
2626
test_result_t("is_allocated() result .true. if & only if the string_t component(s) is/are allocated", check_allocation()), &
2727
test_result_t("extracting a key string from a colon-separated key/value pair", extracts_key()), &
28+
test_result_t("extracting a real value from a colon-separated key/value pair", extracts_real_value()), &
2829
test_result_t("extracting a string value from a colon-separated key/value pair", extracts_string_value()), &
2930
test_result_t("extracting a logical value from a colon-separated key/value pair", extracts_logical_value()), &
3031
test_result_t("extracting an integer array value from a colon-separated key/value pair", extracts_integer_array_value()), &
@@ -50,6 +51,14 @@ function extracts_key() result(passed)
5051
end associate
5152
end function
5253

54+
function extracts_real_value() result(passed)
55+
logical passed
56+
57+
associate(line => string_t('"pi" : 3.14159'))
58+
passed = line%get_json_value(key=string_t("pi"), mold=2.71828) == 3.14159
59+
end associate
60+
end function
61+
5362
function extracts_string_value() result(passed)
5463
logical passed
5564

0 commit comments

Comments
 (0)