From 52784b691d65fd090ff89f80425972afacf41af6 Mon Sep 17 00:00:00 2001 From: Joris Kraak Date: Fri, 14 Apr 2023 23:28:48 +0200 Subject: [PATCH] Resolve `transcode` method ambiguity The examples in many of the codec packages rely on being able to call `transcode` providing a `Codec` type and a string[^1][^2]. #136 removed type annotations from the trailing arguments for `transcode(::Type{C}, ...) where {C<:Codec}` causing a method ambiguity with `transcode(T, src::String)` in Julia `Base`[^3]. This adds an additional method to `Base.transcode` to resolve this ambiguity. Fixes #139. [^1]: https://github.com/JuliaIO/CodecZlib.jl/tree/f9fddaa28c093c590a7a93358709df2945306bc7#usage [^2]: https://github.com/JuliaIO/CodecZstd.jl/tree/6327ffa9a3a12fc46d465dcfc8b30bed91cf284b#usage [^3]: https://github.com/JuliaLang/julia/blob/ff7b8eb00bf887f20bf57fb7e53be0070a242c07/base/c.jl#L306 --- src/transcode.jl | 7 +++++++ test/codecnoop.jl | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/transcode.jl b/src/transcode.jl index b1b03876..93dd41e0 100644 --- a/src/transcode.jl +++ b/src/transcode.jl @@ -40,6 +40,13 @@ function Base.transcode(::Type{C}, args...) where {C<:Codec} end end +# Disambiguate `Base.transcode(::Type{C}, args...)` above from +# `Base.transcode(T, ::String)` in Julia `Base`. This mirrors the +# implementation of the latter +function Base.transcode(::Type{C}, src::String) where {C<:Codec} + return transcode(C, codeunits(src)) +end + _default_output_buffer(codec, input) = Buffer( initial_output_size( codec, diff --git a/test/codecnoop.jl b/test/codecnoop.jl index 22e6e93c..605dd15a 100644 --- a/test/codecnoop.jl +++ b/test/codecnoop.jl @@ -213,6 +213,11 @@ output = TranscodingStreams.Buffer(Vector{UInt8}()) @test transcode(Noop(), data, output) === output.data + data = "" + @test String(transcode(Noop, data)) == data + data = "foo" + @test String(transcode(Noop, data)) == data + TranscodingStreams.test_roundtrip_transcode(Noop, Noop) TranscodingStreams.test_roundtrip_read(NoopStream, NoopStream) TranscodingStreams.test_roundtrip_write(NoopStream, NoopStream)