Skip to content

Commit

Permalink
feat: apply UserTags decoding to the entire related struct
Browse files Browse the repository at this point in the history
  • Loading branch information
makinosp committed Aug 4, 2024
1 parent a368bb8 commit 2ad4e8e
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 50 deletions.
8 changes: 3 additions & 5 deletions Sources/VRCKit/Models/FriendModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@

import Foundation

extension Friend: ProfileElementRepresentable, LocationRepresentable {}

public struct Friend {
public struct Friend: ProfileElementRepresentable, LocationRepresentable {
public let bio: String?
public var bioLinks: SafeDecodingArray<URL>
public let avatarImageUrl: URL?
Expand All @@ -22,7 +20,7 @@ public struct Friend {
public let profilePicOverride: URL?
public let status: UserStatus
public let statusDescription: String
public let tags: [Tag]
public let tags: UserTags
public let userIcon: URL?
public let location: String
public let friendKey: String
Expand All @@ -43,7 +41,7 @@ extension Friend: Codable {
profilePicOverride = try? container.decodeIfPresent(URL.self, forKey: .profilePicOverride)
status = try container.decode(UserStatus.self, forKey: .status)
statusDescription = try container.decode(String.self, forKey: .statusDescription)
tags = try container.decode([Tag].self, forKey: .tags)
tags = try container.decode(UserTags.self, forKey: .tags)
userIcon = try? container.decodeIfPresent(URL.self, forKey: .userIcon)
location = try container.decode(String.self, forKey: .location)
friendKey = try container.decode(String.self, forKey: .friendKey)
Expand Down
43 changes: 4 additions & 39 deletions Sources/VRCKit/Models/UserDetailModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

import Foundation

public typealias Tag = String

public struct UserDetail: ProfileDetailRepresentable, LocationRepresentable {
public var bio: String?
public var bioLinks: SafeDecodingArray<URL>
Expand All @@ -23,45 +21,13 @@ public struct UserDetail: ProfileDetailRepresentable, LocationRepresentable {
public let state: User.State
public let status: UserStatus
public var statusDescription: String
public var tags: Tags
public var tags: UserTags
public let userIcon: URL?
public let location: String
public let friendKey: String
public let dateJoined: String
public var note: String
public let lastActivity: Date

public struct Tags: Codable, Hashable {
let systemTags: [SystemTag]
var languageTags: [LanguageTag]
}
}

public extension UserDetail.Tags {
init() {
systemTags = []
languageTags = []
}
}

public extension UserDetail.Tags {
init(from decoder: Decoder) throws {
var systemTags: [SystemTag] = []
var languageTags: [LanguageTag] = []
var container = try decoder.unkeyedContainer()
while !container.isAtEnd {
let systemTag = try? container.decode(SystemTag.self)
let languageTag = try? container.decode(LanguageTag.self)
if let systemTag = systemTag {
systemTags.append(systemTag)
}
if let languageTag = languageTag {
languageTags.append(languageTag)
}
}
self.systemTags = systemTags
self.languageTags = languageTags
}
}

extension UserDetail: Codable {
Expand All @@ -80,7 +46,7 @@ extension UserDetail: Codable {
state = try container.decode(User.State.self, forKey: .state)
status = try container.decode(UserStatus.self, forKey: .status)
statusDescription = try container.decode(String.self, forKey: .statusDescription)
tags = try container.decode(Tags.self, forKey: .tags)
tags = try container.decode(UserTags.self, forKey: .tags)
userIcon = try? container.decodeIfPresent(URL.self, forKey: .userIcon)
location = try container.decode(String.self, forKey: .location)
friendKey = try container.decode(String.self, forKey: .friendKey)
Expand Down Expand Up @@ -120,7 +86,7 @@ public struct EditableUserInfo: Codable, Hashable {
public var bioLinks: [URL]
public var status: UserStatus
public var statusDescription: String
public var tags: [Tag]
public var tags: UserTags
}

public extension EditableUserInfo {
Expand All @@ -129,7 +95,6 @@ public extension EditableUserInfo {
bioLinks = detail.bioLinks.elements
status = detail.status
statusDescription = detail.statusDescription
// tags = detail.tags
tags = []
tags = detail.tags
}
}
4 changes: 2 additions & 2 deletions Sources/VRCKit/Models/UserModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public struct User: ProfileDetailRepresentable {
public let state: State
public let status: UserStatus
public let statusDescription: String
public let tags: [Tag]
public let tags: UserTags
public let twoFactorAuthEnabled: Bool
public let userIcon: URL?
public let userLanguage: String?
Expand Down Expand Up @@ -80,7 +80,7 @@ extension User: Codable {
state = try container.decode(User.State.self, forKey: .state)
status = try container.decode(UserStatus.self, forKey: .status)
statusDescription = try container.decode(String.self, forKey: .statusDescription)
tags = try container.decode([Tag].self, forKey: .tags)
tags = try container.decode(UserTags.self, forKey: .tags)
twoFactorAuthEnabled = try container.decode(Bool.self, forKey: .twoFactorAuthEnabled)
userIcon = try? container.decodeIfPresent(URL.self, forKey: .userIcon)
userLanguage = try container.decodeIfPresent(String.self, forKey: .userLanguage)
Expand Down
46 changes: 46 additions & 0 deletions Sources/VRCKit/Models/UserTagModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// UserTagModel.swift
// VRCKit
//
// Created by makinosp on 2024/08/04.
//

public struct UserTags: Codable, Hashable {
let systemTags: [SystemTag]
var languageTags: [LanguageTag]
let unknownTags: [String]
}

public extension UserTags {
init() {
systemTags = []
languageTags = []
unknownTags = []
}
}

public extension UserTags {
init(from decoder: Decoder) throws {
var systemTags: [SystemTag] = []
var languageTags: [LanguageTag] = []
var unknownTags: [String] = []
var container = try decoder.unkeyedContainer()
while !container.isAtEnd {
let systemTag = try? container.decode(SystemTag.self)
let languageTag = try? container.decode(LanguageTag.self)
if systemTag == nil, languageTag == nil {
unknownTags.append(try container.decode(String.self))
continue
}
if let systemTag = systemTag {
systemTags.append(systemTag)
}
if let languageTag = languageTag {
languageTags.append(languageTag)
}
}
self.systemTags = systemTags
self.languageTags = languageTags
self.unknownTags = unknownTags
}
}
6 changes: 3 additions & 3 deletions Sources/VRCKit/PreviewServices/PreviewDataProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ final class PreviewDataProvider {
state: .active,
status: .active,
statusDescription: "status",
tags: [],
tags: UserTags(),
twoFactorAuthEnabled: true,
userIcon: URL(string: "https://ul.h3z.jp/9gGIcerr.png"),
userLanguage: nil,
Expand Down Expand Up @@ -130,7 +130,7 @@ final class PreviewDataProvider {
profilePicOverride: nil,
status: status,
statusDescription: "",
tags: [],
tags: UserTags(),
userIcon: URL(string: "https://ul.h3z.jp/9gGIcerr.png"),
location: location,
friendKey: ""
Expand Down Expand Up @@ -158,7 +158,7 @@ final class PreviewDataProvider {
state: state,
status: status,
statusDescription: "Demo",
tags: UserDetail.Tags(),
tags: UserTags(),
userIcon: URL(string: "https://ul.h3z.jp/9gGIcerr.png"),
location: location,
friendKey: "",
Expand Down
2 changes: 1 addition & 1 deletion Sources/VRCKit/Protocols/ProfileProtocols.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public protocol ProfileElementRepresentable: Hashable, Identifiable {
var profilePicOverride: URL? { get }
var status: UserStatus { get }
var statusDescription: String { get }
// var tags: [Tag] { get }
var tags: UserTags { get }
var userIcon: URL? { get }
var friendKey: String { get }
}
Expand Down

0 comments on commit 2ad4e8e

Please sign in to comment.