Using Async Await 2

//
//  ContentVM.swift
//  AsyncAwaitAPIDemo2
//
//  Created by Joynal Abedin on 2/11/23.
//

import Foundation
import Combine

class ContentVM: ObservableObject {
    
    @Published private(set) var respone: Response?
    
    init() {
        Task.init() {
            await fetchData()
        }
    }
    
    func fetchData() async {
        do {
            guard let url = URL(string: "https://devilarticle.com/api/LibraryService/GetAllBook") else { fatalError("missing url") }
            
            let urlRequest = URLRequest(url: url)
            
            let (data, response) = try await URLSession.shared.data(for: urlRequest)
            
            guard (response as? HTTPURLResponse)?.statusCode == 200 else { fatalError("error while fetching data") }
            
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let decodedData = try decoder.decode(Response.self, from: data)
            
            DispatchQueue.main.async {
                self.respone = decodedData
            }
            
        }catch{
            print("Error fetching data from pexels: \(error)")
        }
    }
}
//
//  Response.swift
//  DataTaskAPIDemo
//
//  Created by Joynal Abedin on 1/11/23.
//

import Foundation

struct Response: Codable {
    var responseCode: Int
    var result: String
    var errormessage: String?
    var data: [BookList]
}

struct BookList: Codable {
    var id: Int
    var bookId: Int
    var bookName: String
    var availableCopyNumber: Int
}

//
struct ToDo: Decodable {
  let userId: Int
  let id: Int
  let title: String
  let isComplete: Bool
  
  enum CodingKeys: String, CodingKey {
    case isComplete = "completed"
    case userId, id, title
  }
}