1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
module player_endpoints
implicit none
character(*), parameter::LOCATION_CHECK_IN = "/api/player/{name}/checkin.json"
character(*), parameter::LOCATION_STATUS = "/api/player/{name}/job/{jobid}/task/{step}"
character(*), parameter::LOCATION_JOB_COMPLETE = "/api/player/{name}/job/{jobid}/complete"
character(*), parameter::LOCATION_JOB_FAILED = "/api/player/{name}/job/{jobid}/failed"
integer, parameter::STATUS_STARTING=1
integer, parameter::STATUS_COMPLETED=2
integer, parameter::STATUS_FAILED=3
integer, parameter::STATUS_IN_PROGRESS=4
character(len=10), dimension(4)::status_text = (/ "starting ", &
"complete ", &
"failed ", &
"inprogress" /)
interface replace_field
module procedure replace_field_text
module procedure replace_field_int
end interface
contains
subroutine base_url(server, location, post, res)
implicit none
character(*), intent(in)::server
character(*), intent(in)::location
logical, intent(in)::post
character(*), intent(out)::res
if(post) then
res = "titan://"//trim(server)//trim(location)
else
res = "gemini://"//trim(server)//trim(location)
end if
end subroutine base_url
subroutine replace_field_text(str, field, val)
implicit none
character(*), intent(inout)::str
character(*), intent(in)::field
character(*), intent(in)::val
character(len=:), allocatable::holding
integer::length_estimate
integer::field_location, i, j
! This is too big, but close enough
length_estimate = len_trim(str) + len_trim(val)
allocate(character(len=length_estimate) :: holding)
holding = " "
! Find the field
field_location = index(str, "{"//trim(field)//"}")
if(field_location > 0) then
holding(1:field_location-1) = str(1:field_location-1)
j = field_location
holding(j:j+len_trim(val)) = trim(val)
i = field_location + len_trim(field) + 2
j = len_trim(holding)+1
holding(j:j+(len_trim(str)-i)) = str(i:len_trim(str))
! Put the results back now
str = holding
end if
deallocate(holding)
end subroutine replace_field_text
subroutine replace_field_int(str, field, val)
implicit none
character(*), intent(inout)::str
character(*), intent(in)::field
integer, intent(in)::val
character(16)::int_text
write(int_text, *) val
call replace_field_text(str, field, trim(adjustl(int_text)))
end subroutine replace_field_int
subroutine get_check_in_url(res)
use config
implicit none
character(*), intent(out)::res
call base_url(captain, LOCATION_CHECK_IN, .false., res)
call replace_field(res, "name", identity)
end subroutine get_check_in_url
subroutine get_status_url(job, step, url, posting, status)
use config
implicit none
integer, intent(in)::job
integer, intent(in)::step
logical, intent(in), optional::posting
integer, intent(in), optional::status
character(*), intent(out)::url
character(32)::int_text
if(present(posting)) then
call base_url(captain, LOCATION_STATUS, posting, url)
else
call base_url(captain, LOCATION_STATUS, .false., url)
end if
call replace_field(url, "name", identity)
call replace_field(url, "jobid", job)
call replace_field(url, "step", step)
if(present(status)) then
url = trim(url)//"?"//trim(status_text(status))
end if
end subroutine get_status_url
subroutine get_job_report_url(job, success, res)
use config
implicit none
integer, intent(in)::job
logical, intent(in)::success
character(*), intent(out)::res
if(success) then
call base_url(captain, LOCATION_JOB_COMPLETE, .false., res)
else
call base_url(captain, LOCATION_JOB_FAILED, .false., res)
end if
call replace_field(res, "jobid", job)
end subroutine get_job_report_url
end module player_endpoints
|