IEnumerator FetchLeaderBoardData(string name, Action <LeadBoardData> callback)
    {
        LeadBoardData data = null;

        using (UnityWebRequest webRequest = UnityWebRequest.Get(BaseUrl + GetAllEndPoint + name))
        {
            yield return(webRequest.SendWebRequest());

            if (webRequest.result == UnityWebRequest.Result.ConnectionError)
            {
                Debug.Log("Error: " + webRequest.error);
            }
            else if (webRequest.result == UnityWebRequest.Result.Success)
            {
                try
                {
                    data = JsonUtility.FromJson <LeadBoardData>(webRequest.downloadHandler.text);
                }
                catch (Exception e)
                {
                    Debug.LogError("Couldn't parse JSON correctly : " + e.Message);
                    data = null;
                }
            }
        }
        callback?.Invoke(data);
        yield return(null);
    }
    IEnumerator PostLeaderBoardData(LeadBoardData data)
    {
        string json = JsonUtility.ToJson(data);

        using (UnityWebRequest webRequest = new UnityWebRequest(BaseUrl + GetAllEndPoint, "POST"))
        {
            webRequest.SetRequestHeader("Content-Type", "application/json");
            byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
            webRequest.uploadHandler   = new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = new DownloadHandlerBuffer();
            yield return(webRequest.SendWebRequest());

            if (webRequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError(webRequest.error);
            }
        }
    }
    IEnumerator OnNameEnteredCoroutine(string name)
    {
        LeadBoardData data = null;

        yield return(FetchLeaderBoardData(name, res => { data = res; }));

        int currentScore = ScoreManager.GetCurrentScore();

        if (data == null || currentScore < data.score)
        {
            // Post data
            LeadBoardData newData = new LeadBoardData()
            {
                name  = name,
                score = currentScore
            };
            yield return(PostLeaderBoardData(newData));
        }
        DisplayLeaderBoard();
    }