Skip to content

Commit 3b1d30e

Browse files
committed
feat(string): get_json_value integer mold/result
1 parent ef0d03a commit 3b1d30e

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

src/sourcery/sourcery_string_m.f90

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ module sourcery_string_m
1414
generic :: string => as_character
1515
procedure :: is_allocated
1616
procedure :: get_json_key
17-
procedure :: get_json_string_scalar_value
18-
procedure :: get_json_logical_scalar_value
17+
procedure :: get_json_string_value
18+
procedure :: get_json_logical_value
19+
procedure :: get_json_integer_value
1920
procedure :: get_json_integer_array_value
2021
generic :: get_json_value => &
21-
get_json_string_scalar_value, get_json_logical_scalar_value, get_json_integer_array_value
22+
get_json_string_value, get_json_logical_value, get_json_integer_array_value, get_json_integer_value
2223
procedure :: equivalent
2324
generic :: operator(==) => equivalent
2425
end type
@@ -59,13 +60,20 @@ elemental module function get_json_key(self) result(unquoted_key)
5960
type(string_t) unquoted_key
6061
end function
6162

62-
elemental module function get_json_string_scalar_value(self, key, mold) result(value_)
63+
elemental module function get_json_string_value(self, key, mold) result(value_)
6364
implicit none
6465
class(string_t), intent(in) :: self, key, mold
6566
type(string_t) :: value_
6667
end function
6768

68-
elemental module function get_json_logical_scalar_value(self, key, mold) result(value_)
69+
elemental module function get_json_integer_value(self, key, mold) result(value_)
70+
implicit none
71+
class(string_t), intent(in) :: self, key
72+
integer, intent(in) :: mold
73+
integer value_
74+
end function
75+
76+
elemental module function get_json_logical_value(self, key, mold) result(value_)
6977
implicit none
7078
class(string_t), intent(in) :: self, key
7179
logical, intent(in) :: mold

src/sourcery/sourcery_string_s.f90

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@
5151

5252
end procedure
5353

54-
module procedure get_json_string_scalar_value
54+
module procedure get_json_string_value
5555

5656
character(len=:), allocatable :: raw_line
5757

58-
call assert(key==self%get_json_key(), "key==self%get_string_scalar_json_value()", key)
58+
call assert(key==self%get_json_key(), "key==self%get_string_json_value()", key)
5959

6060
raw_line = self%string()
6161
associate(text_after_colon => raw_line(index(raw_line, ':')+1:))
@@ -72,27 +72,46 @@
7272

7373
end procedure
7474

75-
module procedure get_json_logical_scalar_value
75+
module procedure get_json_logical_value
7676
character(len=:), allocatable :: raw_line, string_value
7777

78-
call assert(key==self%get_json_key(), "string_s(get_json_logical_scalar_value): key==self%get_json_key()", key)
78+
call assert(key==self%get_json_key(), "string_s(get_json_logical_value): key==self%get_json_key()", key)
7979

8080
raw_line = self%string()
8181
associate(text_after_colon => raw_line(index(raw_line, ':')+1:))
82-
associate(comma => index(text_after_colon, ','))
83-
if (comma == 0) then
82+
associate(trailing_comma => index(text_after_colon, ','))
83+
if (trailing_comma == 0) then
8484
string_value = trim(adjustl((text_after_colon)))
8585
else
86-
string_value = trim(adjustl((text_after_colon(:comma-1))))
86+
string_value = trim(adjustl((text_after_colon(:trailing_comma-1))))
8787
end if
8888
call assert(string_value=="true" .or. string_value=="false", &
89-
'string_s(get_json_logical_scalar_value): string_value=="true" .or. string_value="false"', string_value)
89+
'string_s(get_json_logical_value): string_value=="true" .or. string_value="false"', string_value)
9090
value_ = string_value == "true"
9191
end associate
9292
end associate
9393

9494
end procedure
9595

96+
module procedure get_json_integer_value
97+
character(len=:), allocatable :: raw_line, string_value
98+
99+
call assert(key==self%get_json_key(), "string_s(get_json_logical_value): key==self%get_json_key()", key)
100+
101+
raw_line = self%string()
102+
associate(text_after_colon => raw_line(index(raw_line, ':')+1:))
103+
associate(trailing_comma => index(text_after_colon, ','))
104+
if (trailing_comma == 0) then
105+
string_value = trim(adjustl((text_after_colon)))
106+
else
107+
string_value = trim(adjustl((text_after_colon(:trailing_comma-1))))
108+
end if
109+
read(string_value, fmt=*) value_
110+
end associate
111+
end associate
112+
113+
end procedure
114+
96115
module procedure get_json_integer_array_value
97116
character(len=:), allocatable :: raw_line
98117
real, allocatable :: real_array(:)
@@ -108,7 +127,7 @@
108127
associate(num_inputs => commas + 1)
109128
allocate(real_array(num_inputs))
110129
read(raw_line(opening_bracket+1:closing_bracket-1), fmt=*) real_array
111-
value_ = real_array
130+
value_ = int(real_array)
112131
end associate
113132
end associate
114133
end associate

test/string_test.f90

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ function results() result(test_results)
2424

2525
test_results = [ &
2626
test_result_t("is_allocated() result .true. if & only if the string_t component(s) is/are allocated", check_allocation()), &
27-
test_result_t("extracting a key string from colon-separated key/value pair", extracts_key()), &
28-
test_result_t("extracting a string value from colon-separated key/value pair", extracts_string_scalar_value()), &
29-
test_result_t("extracting a logical value from colon-separated key/value pair", extracts_logical_scalar_value()), &
30-
test_result_t("extracting an integer array value from colon-separated key/value pair", extracts_integer_array_value()) &
27+
test_result_t("extracting a key string from a colon-separated key/value pair", extracts_key()), &
28+
test_result_t("extracting a string value from a colon-separated key/value pair", extracts_string_value()), &
29+
test_result_t("extracting a logical value from a colon-separated key/value pair", extracts_logical_value()), &
30+
test_result_t("extracting an integer array value from a colon-separated key/value pair", extracts_integer_array_value()), &
31+
test_result_t("extracting an integer value from a colon-separated key/value pair", extracts_integer_value()) &
3132
]
3233
end function
3334

@@ -49,15 +50,23 @@ function extracts_key() result(passed)
4950
end associate
5051
end function
5152

52-
function extracts_string_scalar_value() result(passed)
53+
function extracts_string_value() result(passed)
5354
logical passed
5455

5556
associate(line => string_t('"foo" : "bar"'))
5657
passed = line%get_json_value(key=string_t("foo"), mold=string_t("")) == string_t("bar")
5758
end associate
5859
end function
5960

60-
function extracts_logical_scalar_value() result(passed)
61+
function extracts_integer_value() result(passed)
62+
logical passed
63+
64+
associate(line => string_t('"an integer" : 99'))
65+
passed = line%get_json_value(key=string_t("an integer"), mold=0) == 99
66+
end associate
67+
end function
68+
69+
function extracts_logical_value() result(passed)
6170
logical passed
6271

6372
associate( &

0 commit comments

Comments
 (0)