!> A one-shot command-line front end, useful for confirming that an instance !> answers: `cepis --base-url http://localhost:8080 01001000`. program main use, intrinsic :: iso_fortran_env, only: real64, output_unit, error_unit use cepis implicit none character(len=:), allocatable :: url, message character(len=:), allocatable :: ceps(:) type(cepis_client) :: client integer :: status logical :: want_health call parse_arguments(url, ceps, want_health) if (len(url) > 0) then call cepis_client_init(client, status, message, base_url=url) else call cepis_client_init(client, status, message) end if if (status /= CEPIS_OK) then write (error_unit, '(A)') 'cepis: '//message stop 2 end if if (want_health) then call show_health(client) else if (size(ceps) == 1) then call show_one(client, trim(ceps(1))) else call show_many(client, ceps) end if contains subroutine usage() write (error_unit, '(A)') 'usage: cepis [--base-url URL] CEP [CEP ...]' write (error_unit, '(A)') ' cepis [--base-url URL] --health' stop 2 end subroutine usage subroutine parse_arguments(base, values, health) character(len=:), allocatable, intent(out) :: base character(len=:), allocatable, intent(out) :: values(:) logical, intent(out) :: health character(len=4096) :: argument character(len=64) :: collected(256) integer :: count, i, length, total base = '' health = .false. count = 0 total = command_argument_count() i = 1 do while (i <= total) call get_command_argument(i, argument, length) if (argument(1:length) == '--health') then health = .true. else if (argument(1:length) == '--base-url') then i = i + 1 if (i > total) call usage() call get_command_argument(i, argument, length) base = argument(1:length) else if (argument(1:length) == '--help' .or. argument(1:length) == '-h') then call usage() else if (count >= size(collected)) call usage() count = count + 1 collected(count) = argument(1:min(length, len(collected))) end if i = i + 1 end do if (.not. health .and. count == 0) call usage() allocate (character(len=64) :: values(count)) do i = 1, count values(i) = collected(i) end do end subroutine parse_arguments subroutine show_health(handle) type(cepis_client), intent(in) :: handle type(cepis_health) :: report integer :: code character(len=:), allocatable :: detail call handle%health(report, code, detail) if (code /= CEPIS_OK) then write (error_unit, '(A)') 'cepis: '//cepis_status_name(code)//': '//detail stop 1 end if write (output_unit, '(A)') 'status '//report%status write (output_unit, '(A)') 'dne '//report%dne write (output_unit, '(A,I0)') 'ceps ', report%ceps write (output_unit, '(A,I0)') 'geo ', report%geo write (output_unit, '(A)') 'base_gerada_em '//report%base_gerada_em end subroutine show_health subroutine show_one(handle, cep) type(cepis_client), intent(in) :: handle character(len=*), intent(in) :: cep type(cepis_address) :: address integer :: code character(len=:), allocatable :: detail call handle%lookup(cep, address, code, detail) if (code /= CEPIS_OK) then write (error_unit, '(A)') 'cepis: '//cepis_status_name(code)//': '//detail stop 1 end if write (output_unit, '(A)') 'cep '//address%formatted_cep() write (output_unit, '(A)') 'logradouro '//address%logradouro write (output_unit, '(A)') 'complemento '//address%complemento write (output_unit, '(A)') 'unidade '//address%unidade write (output_unit, '(A)') 'bairro '//address%bairro write (output_unit, '(A)') 'localidade '//address%localidade write (output_unit, '(A)') 'uf '//address%uf write (output_unit, '(A)') 'estado '//address%estado write (output_unit, '(A)') 'regiao '//address%regiao write (output_unit, '(A)') 'ibge '//address%ibge write (output_unit, '(A)') 'gia '//address%gia write (output_unit, '(A)') 'ddd '//address%ddd write (output_unit, '(A)') 'siafi '//address%siafi if (address%has_geo) then write (output_unit, '(A,F0.6,A,F0.6,A,I0,A)') 'geo ', & address%geo%lat, ', ', address%geo%lon, ' (', address%geo%raio_m, & ' m, '//address%geo%precisao//')' end if end subroutine show_one subroutine show_many(handle, values) type(cepis_client), intent(in) :: handle character(len=*), intent(in) :: values(:) type(cepis_address), allocatable :: addresses(:) integer :: code, i character(len=:), allocatable :: detail call handle%lookup_many(values, addresses, code, detail) if (code /= CEPIS_OK) then write (error_unit, '(A)') 'cepis: '//cepis_status_name(code)//': '//detail stop 1 end if do i = 1, size(addresses) if (addresses(i)%found) then write (output_unit, '(A)') trim(values(i))//' '// & addresses(i)%localidade//'/'//addresses(i)%uf//' '// & addresses(i)%logradouro else write (output_unit, '(A)') trim(values(i))//' not found' end if end do end subroutine show_many end program main