Skip to content

Commit

Permalink
feat: implement custom decoder for user tags
Browse files Browse the repository at this point in the history
  • Loading branch information
makinosp committed Aug 3, 2024
1 parent ae20e6a commit 93e43a5
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 9 deletions.
45 changes: 38 additions & 7 deletions Sources/VRCKit/Models/UserDetailModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@

import Foundation

extension UserDetail: ProfileDetailRepresentable, LocationRepresentable {}

public typealias Tag = String

public struct UserDetail {
public struct UserDetail: ProfileDetailRepresentable, LocationRepresentable {
public var bio: String?
public var bioLinks: SafeDecodingArray<URL>
public let avatarImageUrl: URL?
Expand All @@ -25,17 +23,49 @@ public struct UserDetail {
public let state: User.State
public let status: UserStatus
public var statusDescription: String
public var tags: [Tag]
public var tags: Tags
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 {
public init(from decoder: any Decoder) throws {
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
bio = try container.decodeIfPresent(String.self, forKey: .bio)
bioLinks = try container.decodeSafeNullableArray(URL.self, forKey: .bioLinks)
Expand All @@ -50,7 +80,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([Tag].self, forKey: .tags)
tags = try container.decode(Tags.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 @@ -99,6 +129,7 @@ public extension EditableUserInfo {
bioLinks = detail.bioLinks.elements
status = detail.status
statusDescription = detail.statusDescription
tags = detail.tags
// tags = detail.tags
tags = []
}
}
65 changes: 65 additions & 0 deletions Sources/VRCKit/Models/UserTagModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
//
// UserTagModel.swift
// VRCKit
//
// Created by makinosp on 2024/08/03.
//

import Foundation

public enum SystemTag: String, Hashable, Codable {
case adminAvatarAccess = "admin_avatar_access"
case adminCanGrantLicenses = "admin_can_grant_licenses"
case adminCannyAccess = "admin_canny_access"
case adminLockTags = "admin_lock_tags"
case adminLockLevel = "admin_lock_level"
case adminModerator = "admin_moderator"
case adminOfficialThumbnail = "admin_official_thumbnail"
case adminScriptingAccess = "admin_scripting_access"
case adminWorldAccess = "admin_world_access"
case showSocialRank = "show_social_rank"
case showModTag = "show_mod_tag"
case systemAvatarAccess = "system_avatar_access"
case systemEarlyAdopter = "system_early_adopter"
case systemFeedbackAccess = "system_feedback_access"
case systemProbableTroll = "system_probable_troll"
case systemSupporter = "system_supporter"
case systemTroll = "system_troll"
case systemTrustBasic = "system_trust_basic"
case systemTrustKnown = "system_trust_known"
case systemTrustTrusted = "system_trust_trusted"
case systemTrustVeteran = "system_trust_veteran"
case systemWorldAccess = "system_world_access"
}

public enum LanguageTag: String, Hashable, Codable {
case english = "language_eng"
case korean = "language_kor"
case russian = "language_rus"
case spanish = "language_spa"
case portuguese = "language_por"
case chinese = "language_zho"
case german = "language_deu"
case japanese = "language_jpn"
case french = "language_fra"
case swedish = "language_swe"
case dutch = "language_nld"
case polish = "language_pol"
case danish = "language_dan"
case norwegian = "language_nor"
case italian = "language_ita"
case thai = "language_tha"
case finnish = "language_fin"
case hungarian = "language_hun"
case czech = "language_ces"
case turkish = "language_tur"
case arabic = "language_ara"
case romanian = "language_ron"
case vietnamese = "language_vie"
case americanSignLanguage = "language_ase"
case britishSignLanguage = "language_bfi"
case dutchSignLanguage = "language_dse"
case frenchSignLanguage = "language_fsl"
case japaneseSignLanguage = "language_jsl"
case koreanSignLanguage = "language_kvk"
}
2 changes: 1 addition & 1 deletion Sources/VRCKit/PreviewServices/PreviewDataProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ final class PreviewDataProvider {
state: state,
status: status,
statusDescription: "Demo",
tags: [],
tags: UserDetail.Tags(),
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: [Tag] { get }
var userIcon: URL? { get }
var friendKey: String { get }
}
Expand Down

0 comments on commit 93e43a5

Please sign in to comment.