Fix handling of HTTP 204 on statistics endpoints
The ListenBrainz API returns 204 and an empty document when there are no statistics, which can't be parsed as JSON. Therefore the return types of statistics endpoints now includes an Option to reflect this.
This commit is contained in:
		
							parent
							
								
									cce6d09b35
								
							
						
					
					
						commit
						67d9bf9632
					
				| 
						 | 
				
			
			@ -42,7 +42,7 @@ impl Client {
 | 
			
		|||
        count: Option<u64>,
 | 
			
		||||
        offset: Option<u64>,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<R, Error> {
 | 
			
		||||
    ) -> Result<Option<R>, Error> {
 | 
			
		||||
        let endpoint = format!("{}{}", API_ROOT_URL, endpoint);
 | 
			
		||||
 | 
			
		||||
        let mut request = self.agent.get(&endpoint);
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +57,14 @@ impl Client {
 | 
			
		|||
            request = request.query("range", range);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        request.call()?.into_json().map_err(Error::ResponseJson)
 | 
			
		||||
        let response = request.call()?;
 | 
			
		||||
 | 
			
		||||
        // API returns 204 and an empty document if there are no statistics
 | 
			
		||||
        if response.status() == 204 {
 | 
			
		||||
            Ok(None)
 | 
			
		||||
        } else {
 | 
			
		||||
            response.into_json().map(Some).map_err(Error::ResponseJson)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn post<D, R>(&mut self, endpoint: Endpoint, token: &str, data: D) -> Result<R, Error>
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +188,7 @@ impl Client {
 | 
			
		|||
        count: Option<u64>,
 | 
			
		||||
        offset: Option<u64>,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsSitewideArtistsResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsSitewideArtistsResponse>, Error> {
 | 
			
		||||
        self.get_stats(Endpoint::StatsSitewideArtists, count, offset, range)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -190,7 +197,7 @@ impl Client {
 | 
			
		|||
        &mut self,
 | 
			
		||||
        user_name: &str,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsUserListeningActivityResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsUserListeningActivityResponse>, Error> {
 | 
			
		||||
        let endpoint = format!(
 | 
			
		||||
            "{}{}",
 | 
			
		||||
            API_ROOT_URL,
 | 
			
		||||
| 
						 | 
				
			
			@ -203,7 +210,14 @@ impl Client {
 | 
			
		|||
            request = request.query("range", range);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        request.call()?.into_json().map_err(Error::ResponseJson)
 | 
			
		||||
        let response = request.call()?;
 | 
			
		||||
 | 
			
		||||
        // API returns 204 and an empty document if there are no statistics
 | 
			
		||||
        if response.status() == 204 {
 | 
			
		||||
            Ok(None)
 | 
			
		||||
        } else {
 | 
			
		||||
            response.into_json().map(Some).map_err(Error::ResponseJson)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Endpoint: `stats/user/{user_name}/daily-activity`
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +225,7 @@ impl Client {
 | 
			
		|||
        &mut self,
 | 
			
		||||
        user_name: &str,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsUserDailyActivityResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsUserDailyActivityResponse>, Error> {
 | 
			
		||||
        let endpoint = format!(
 | 
			
		||||
            "{}{}",
 | 
			
		||||
            API_ROOT_URL,
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +238,14 @@ impl Client {
 | 
			
		|||
            request = request.query("range", range);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        request.call()?.into_json().map_err(Error::ResponseJson)
 | 
			
		||||
        let response = request.call()?;
 | 
			
		||||
 | 
			
		||||
        // API returns 204 and an empty document if there are no statistics
 | 
			
		||||
        if response.status() == 204 {
 | 
			
		||||
            Ok(None)
 | 
			
		||||
        } else {
 | 
			
		||||
            response.into_json().map(Some).map_err(Error::ResponseJson)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Endpoint: `stats/user/{user_name}/recordings`
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +255,7 @@ impl Client {
 | 
			
		|||
        count: Option<u64>,
 | 
			
		||||
        offset: Option<u64>,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsUserRecordingsResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsUserRecordingsResponse>, Error> {
 | 
			
		||||
        self.get_stats(
 | 
			
		||||
            Endpoint::StatsUserRecordings(user_name),
 | 
			
		||||
            count,
 | 
			
		||||
| 
						 | 
				
			
			@ -275,7 +296,7 @@ impl Client {
 | 
			
		|||
        count: Option<u64>,
 | 
			
		||||
        offset: Option<u64>,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsUserReleasesResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsUserReleasesResponse>, Error> {
 | 
			
		||||
        self.get_stats(Endpoint::StatsUserReleases(user_name), count, offset, range)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -286,7 +307,7 @@ impl Client {
 | 
			
		|||
        count: Option<u64>,
 | 
			
		||||
        offset: Option<u64>,
 | 
			
		||||
        range: Option<&str>,
 | 
			
		||||
    ) -> Result<StatsUserArtistsResponse, Error> {
 | 
			
		||||
    ) -> Result<Option<StatsUserArtistsResponse>, Error> {
 | 
			
		||||
        self.get_stats(Endpoint::StatsUserArtists(user_name), count, offset, range)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue