WIP: readme and changelog

This commit is contained in:
Sami Samhuri 2025-06-15 08:46:19 -07:00
parent a077d7fdc6
commit cfda789ba4
No known key found for this signature in database
2 changed files with 53 additions and 2 deletions

View file

@ -1,8 +1,18 @@
# Changelog
## [2.0.1] - Unreleased
## [2.1.0] - Unreleased
[2.0.1]: https://github.com/samsonjs/Osiris/compare/2.0.0...main
### Added
- **Codable support for JSON** - First-class support for encoding and decoding Codable types
- **New convenience methods** `HTTPRequest.postJSON(_:body:)` and `HTTPRequest.putJSON(_:body:)` for Codable requests
- **Response decoding methods** `HTTPResponse.decode(_:using:)` and `HTTPResponse.tryDecode(_:using:)` with JSONDecoder support
- **Codable body property** on HTTPRequest that takes precedence over parameters dictionary
### Enhanced
- **RequestBuilder** now supports JSONEncoder for Codable bodies alongside existing JSONSerialization
- **Comprehensive test coverage** for all Codable functionality with 14 new tests
[2.1.0]: https://github.com/samsonjs/Osiris/compare/2.0.0...main
## [2.0.0] - 2025-06-15

View file

@ -99,6 +99,45 @@ request.addHeader(name: "x-custom", value: "42")
request.addMultipartJPEG(name: "avatar", image: UIImage(), quality: 1, filename: "avatar.jpg")
```
### Codable Support
For modern Swift applications, Osiris provides first-class support for `Codable` types with JSON encoding and decoding:
```swift
// Define your models
struct Person: Codable, Sendable {
let name: String
let email: String
let age: Int
}
// POST request with Codable body
let person = Person(name: "Jane Doe", email: "jane@example.net", age: 30)
let request = HTTPRequest.postJSON(url, body: person)
// Build and send the request
let urlRequest = try RequestBuilder.build(request: request)
let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in
let httpResponse = HTTPResponse(response: response, data: data, error: error)
switch httpResponse {
case .success(_, _):
// Decode the response
let updatedPerson = try httpResponse.decode(Person.self)
print("Updated person: \(updatedPerson)")
// Or use the optional variant
if let person = httpResponse.tryDecode(Person.self) {
print("Decoded person: \(person)")
}
case .failure(let error, _, _):
print("Request failed: \(error)")
}
}
```
The Codable body takes precedence over the parameters dictionary, so you can safely use both without conflicts.
You can build a `URLRequest` from an `HTTPRequest` instance using `RequestBuilder`:
```swift
@ -135,6 +174,8 @@ The response provides convenient properties:
- `headers`: a dictionary of headers
- `bodyString`: the response body as a `String`
- `dictionaryFromJSON`: the decoded body for JSON responses
- `decode(_:using:)`: decode the response body as a Codable type (throws on failure)
- `tryDecode(_:using:)`: decode the response body as a Codable type (returns nil on failure)
- `underlyingResponse`: the optional `HTTPURLResponse` for direct access
### FormEncoder