Skip to content

Commit 1d6fd3c

Browse files
committed
Add String.valid?
1 parent feed5c1 commit 1d6fd3c

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

Diff for: lib/elixir/lib/string.ex

+28
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,34 @@ defmodule String do
458458
@spec next_codepoint(t) :: {codepoint, t} | :no_codepoint
459459
defdelegate next_codepoint(string), to: String.Unicode
460460

461+
@doc %B"""
462+
Checks whether `str` is a valid UTF-8 string.
463+
464+
## Examples
465+
466+
iex> String.valid?("a")
467+
true
468+
iex> String.valid?("ø")
469+
true
470+
iex> String.valid?(<<0xffff :: 16>>)
471+
false
472+
iex> String.valid?("asd" <> <<0xffff :: 16>>)
473+
false
474+
475+
"""
476+
@spec valid?(t) :: boolean
477+
def valid?(<<_ :: utf8, t :: binary>>) do
478+
valid?(t)
479+
end
480+
481+
def valid?(<<>>) do
482+
true
483+
end
484+
485+
def valid?(_) do
486+
false
487+
end
488+
461489
@doc %B"""
462490
Checks whether `str` is a valid codepoint.
463491

Diff for: lib/elixir/test/elixir/string_test.exs

+9
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,15 @@ defmodule StringTest do
228228
assert String.slice("", 0, 1) == nil
229229
end
230230

231+
test :valid? do
232+
assert String.valid?("afds")
233+
assert String.valid?("øsdfh")
234+
assert String.valid?("dskfjあska")
235+
236+
refute String.valid?(<<0xffff :: 16>>)
237+
refute String.valid?("asd" <> <<0xffff :: 16>>)
238+
end
239+
231240
test :valid_codepoint? do
232241
assert String.valid_codepoint?("a")
233242
assert String.valid_codepoint?("ø")

0 commit comments

Comments
 (0)