package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"sync"
)
type Indonesia struct {
ID string
Name string
}
func provinces(wg *sync.WaitGroup, mu *sync.Mutex, shared chan string, release chan bool, name string) {
defer wg.Done()
<-release
provinces := []Indonesia{}
provinceId := ""
res, err := http.Get("https://www.emsifa.com/api-wilayah-indonesia/api/provinces.json")
if err != nil {
log.Panic(err)
}
defer res.Body.Close()
if err := json.NewDecoder(res.Body).Decode(&provinces); err != nil {
log.Panic(err)
}
for _, v := range provinces {
if v.Name == name {
mu.Lock()
defer mu.Unlock()
provinceId = v.ID
}
}
if len(provinceId) > 0 {
shared <- provinceId
} else {
shared <- provinceId
}
}
func regencies(wg *sync.WaitGroup, mu *sync.Mutex, shared chan string, release chan bool, name string) {
defer wg.Done()
<-release
provinceId := <-shared
regencieId := ""
if len(provinceId) > 0 {
regencies := []Indonesia{}
res, err := http.Get(fmt.Sprintf("https://www.emsifa.com/api-wilayah-indonesia/api/regencies/%s.json", provinceId))
if err != nil {
log.Panic(err)
}
defer res.Body.Close()
if err := json.NewDecoder(res.Body).Decode(®encies); err != nil {
log.Panic(err)
}
for _, v := range regencies {
if v.Name == name {
mu.Lock()
defer mu.Unlock()
regencieId = v.ID
}
}
}
if len(regencieId) > 0 {
shared <- regencieId
} else {
shared <- regencieId
}
}
func districts(wg *sync.WaitGroup, mu *sync.Mutex, shared chan string, release chan bool, name string) {
defer wg.Done()
<-release
regencieId := <-shared
districtId := ""
if len(regencieId) > 0 {
regencies := []Indonesia{}
res, err := http.Get(fmt.Sprintf("https://www.emsifa.com/api-wilayah-indonesia/api/districts/%s.json", regencieId))
if err != nil {
log.Panic(err)
}
defer res.Body.Close()
if err := json.NewDecoder(res.Body).Decode(®encies); err != nil {
log.Panic(err)
}
for _, v := range regencies {
if v.Name == name {
mu.Lock()
defer mu.Unlock()
districtId = v.Name
}
}
}
if len(districtId) > 0 {
shared <- districtId
} else {
shared <- districtId
}
}
func done(wg *sync.WaitGroup, release chan bool) {
defer wg.Done()
<-release
}
func Result() interface{} {
var (
wg *sync.WaitGroup = new(sync.WaitGroup)
mu *sync.Mutex = new(sync.Mutex)
release chan bool = make(chan bool, 1)
shared chan string = make(chan string)
received string
)
wg.Add(4)
release <- true
go provinces(wg, mu, shared, release, "DKI JAKARTA")
release <- true
go regencies(wg, mu, shared, release, "KOTA JAKARTA SELATAN")
release <- true
go districts(wg, mu, shared, release, "JAGAKARSA")
release <- true
go done(wg, release)
received = <-shared
wg.Wait()
return received
}
func main() {
fmt.Println(Result())
}