aboutsummaryrefslogtreecommitdiff
path: root/player/endpoints.f90
blob: 8ec339d1c39219d54a1151073a82e734435a0a63 (plain)
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