Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ let package = Package(
],
dependencies: [
.package(url: "https://github.com/omochi/SwiftTypeReader", from: "2.1.1"),
.package(url: "https://github.com/omochi/TypeScriptAST", from: "1.0.0")
.package(url: "https://github.com/omochi/TypeScriptAST", from: "1.1.0")
],
targets: [
.target(
Expand Down
5 changes: 0 additions & 5 deletions Sources/CodableToTypeScript/Extensions/STypeEx.swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,6 @@ extension SType {
guard let self = self.asNominal else { return false }
return self.nominalTypeDecl.isStandardLibraryType(name)
}

func hasStringRawValue() -> Bool {
guard let self = self.asNominal else { return false }
return self.nominalTypeDecl.hasStringRawValue()
}
}

extension ParamDecl {
Expand Down
48 changes: 40 additions & 8 deletions Sources/CodableToTypeScript/Generator/CodeGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import TypeScriptAST

public final class CodeGenerator {
internal final class RequestToken: HashableFromIdentity {
unowned let gen: CodeGenerator
init(gen: CodeGenerator) {
self.gen = gen
unowned let generator: CodeGenerator
init(generator: CodeGenerator) {
self.generator = generator
}
}

Expand All @@ -20,7 +20,7 @@ public final class CodeGenerator {
) {
self.context = context
self.typeConverterProvider = typeConverterProvider
self.requestToken = RequestToken(gen: self)
self.requestToken = RequestToken(generator: self)
}

public func converter(for type: any SType) throws -> any TypeConverter {
Expand All @@ -40,11 +40,11 @@ public final class CodeGenerator {
internal struct ConverterRequest: Request {
var token: RequestToken
@AnyTypeStorage var type: any SType
private var gen: CodeGenerator { token.gen }
private var generator: CodeGenerator { token.generator }

func evaluate(on evaluator: RequestEvaluator) throws -> any TypeConverter {
let impl = try gen.implConverter(for: type)
return GeneratorProxyConverter(generator: gen, type: type, impl: impl)
let impl = try generator.implConverter(for: type)
return GeneratorProxyConverter(generator: generator, type: type, impl: impl)
}
}

Expand All @@ -54,7 +54,7 @@ public final class CodeGenerator {

func evaluate(on evaluator: RequestEvaluator) throws -> Bool {
do {
let converter = try token.gen.implConverter(for: type)
let converter = try token.generator.implConverter(for: type)
return try converter.hasDecode()
} catch {
switch error {
Expand All @@ -65,6 +65,23 @@ public final class CodeGenerator {
}
}

internal struct HasEncodeRequest: Request {
var token: RequestToken
@AnyTypeStorage var type: any SType

func evaluate(on evaluator: RequestEvaluator) throws -> Bool {
do {
let converter = try token.generator.implConverter(for: type)
return try converter.hasEncode()
} catch {
switch error {
case is CycleRequestError: return true
default: throw error
}
}
}
}

func helperLibrary() -> HelperLibraryGenerator {
return HelperLibraryGenerator(generator: self)
}
Expand All @@ -87,4 +104,19 @@ public final class CodeGenerator {

return TSCallExpr(callee: callee, args: args)
}

public func callEncode(
callee: any TSExpr,
genericArgs: [any SType],
entity: any TSExpr
) throws -> any TSExpr {
var args: [any TSExpr] = [entity]

for arg in genericArgs {
let encode = try converter(for: arg).boundEncode()
args.append(encode)
}

return TSCallExpr(callee: callee, args: args)
}
}
Loading