diff --git a/src/dawn/native/d3d/ShaderUtils.cpp b/src/dawn/native/d3d/ShaderUtils.cpp
index 6b86aaa..0c1359e 100644
--- a/src/dawn/native/d3d/ShaderUtils.cpp
+++ b/src/dawn/native/d3d/ShaderUtils.cpp
@@ -244,11 +244,11 @@
 
     TRACE_EVENT0(tracePlatform.UnsafeGetValue(), General, "tint::hlsl::writer::Generate");
     auto result = tint::hlsl::writer::Generate(&transformedProgram, options);
-    DAWN_INVALID_IF(!result.success, "An error occured while generating HLSL: %s", result.error);
+    DAWN_INVALID_IF(!result, "An error occured while generating HLSL: %s", result.Failure());
 
     compiledShader->usesVertexIndex = usesVertexIndex;
     compiledShader->usesInstanceIndex = usesInstanceIndex;
-    compiledShader->hlslSource = std::move(result.hlsl);
+    compiledShader->hlslSource = std::move(result->hlsl);
     return {};
 }
 
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index e2d661dd..992d13d 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -1188,8 +1188,8 @@
     "lang/hlsl/writer/ast_printer/ast_printer.h",
     "lang/hlsl/writer/common/options.cc",
     "lang/hlsl/writer/common/options.h",
-    "lang/hlsl/writer/result.cc",
-    "lang/hlsl/writer/result.h",
+    "lang/hlsl/writer/output.cc",
+    "lang/hlsl/writer/output.h",
     "lang/hlsl/writer/writer.cc",
     "lang/hlsl/writer/writer.h",
   ]
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 31b3599..9f3e025 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -754,8 +754,8 @@
   list(APPEND TINT_LIB_SRCS
     lang/hlsl/writer/common/options.cc
     lang/hlsl/writer/common/options.h
-    lang/hlsl/writer/result.cc
-    lang/hlsl/writer/result.h
+    lang/hlsl/writer/output.cc
+    lang/hlsl/writer/output.h
     lang/hlsl/writer/writer.cc
     lang/hlsl/writer/writer.h
     lang/hlsl/writer/ast_printer/ast_printer.cc
diff --git a/src/tint/cmd/loopy.cc b/src/tint/cmd/loopy.cc
index c69926c..118bc08 100644
--- a/src/tint/cmd/loopy.cc
+++ b/src/tint/cmd/loopy.cc
@@ -247,9 +247,9 @@
     gen_options.external_texture_options.bindings_map =
         tint::cmd::GenerateExternalTextureBindings(program);
     auto result = tint::hlsl::writer::Generate(program, gen_options);
-    if (!result.success) {
+    if (!result) {
         tint::cmd::PrintWGSL(std::cerr, *program);
-        std::cerr << "Failed to generate: " << result.error << std::endl;
+        std::cerr << "Failed to generate: " << result.Failure() << std::endl;
         return false;
     }
 
diff --git a/src/tint/cmd/main.cc b/src/tint/cmd/main.cc
index 92873df..88d88a4 100644
--- a/src/tint/cmd/main.cc
+++ b/src/tint/cmd/main.cc
@@ -692,17 +692,17 @@
         tint::cmd::GenerateExternalTextureBindings(program);
     gen_options.root_constant_binding_point = options.hlsl_root_constant_binding_point;
     auto result = tint::hlsl::writer::Generate(program, gen_options);
-    if (!result.success) {
+    if (!result) {
         tint::cmd::PrintWGSL(std::cerr, *program);
-        std::cerr << "Failed to generate: " << result.error << std::endl;
+        std::cerr << "Failed to generate: " << result.Failure() << std::endl;
         return false;
     }
 
-    if (!WriteFile(options.output_file, "w", result.hlsl)) {
+    if (!WriteFile(options.output_file, "w", result->hlsl)) {
         return false;
     }
 
-    const auto hash = tint::CRC32(result.hlsl.c_str());
+    const auto hash = tint::CRC32(result->hlsl.c_str());
     if (options.print_hash) {
         PrintHash(hash);
     }
@@ -731,7 +731,7 @@
                 }
 
                 dxc_res = tint::hlsl::validate::UsingDXC(
-                    dxc.Path(), result.hlsl, result.entry_points, dxc_require_16bit_types);
+                    dxc.Path(), result->hlsl, result->entry_points, dxc_require_16bit_types);
             } else if (must_validate_dxc) {
                 // DXC was explicitly requested. Error if it could not be found.
                 dxc_res.failed = true;
@@ -751,7 +751,7 @@
             if (fxc.Found()) {
                 fxc_found = true;
                 fxc_res =
-                    tint::hlsl::validate::UsingFXC(fxc.Path(), result.hlsl, result.entry_points);
+                    tint::hlsl::validate::UsingFXC(fxc.Path(), result->hlsl, result->entry_points);
             } else if (must_validate_fxc) {
                 // FXC was explicitly requested. Error if it could not be found.
                 fxc_res.failed = true;
diff --git a/src/tint/fuzzers/tint_common_fuzzer.cc b/src/tint/fuzzers/tint_common_fuzzer.cc
index 2e1da16..7f2d93f 100644
--- a/src/tint/fuzzers/tint_common_fuzzer.cc
+++ b/src/tint/fuzzers/tint_common_fuzzer.cc
@@ -313,7 +313,7 @@
         }
         case OutputFormat::kHLSL: {
 #if TINT_BUILD_HLSL_WRITER
-            hlsl::writer::Generate(&program, options_hlsl_);
+            (void)hlsl::writer::Generate(&program, options_hlsl_);
 #endif  // TINT_BUILD_HLSL_WRITER
             break;
         }
diff --git a/src/tint/fuzzers/tint_concurrency_fuzzer.cc b/src/tint/fuzzers/tint_concurrency_fuzzer.cc
index 9b2d6f2..f09524d 100644
--- a/src/tint/fuzzers/tint_concurrency_fuzzer.cc
+++ b/src/tint/fuzzers/tint_concurrency_fuzzer.cc
@@ -95,7 +95,7 @@
 
 #if TINT_BUILD_HLSL_WRITER
                 case Writer::kHLSL: {
-                    tint::hlsl::writer::Generate(&program, {});
+                    (void)tint::hlsl::writer::Generate(&program, {});
                     break;
                 }
 #endif  // TINT_BUILD_HLSL_WRITER
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
index 5187dd2..c616f72 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
@@ -27,7 +27,8 @@
     auto program = std::make_unique<Program>(resolver::Resolve(*this));
     ASSERT_FALSE(program->IsValid());
     auto result = Generate(program.get(), Options{});
-    EXPECT_EQ(result.error, "input program is not valid");
+    EXPECT_FALSE(result);
+    EXPECT_EQ(result.Failure(), "input program is not valid");
 }
 
 TEST_F(HlslASTPrinterTest, UnsupportedExtension) {
diff --git a/src/tint/lang/hlsl/writer/result.cc b/src/tint/lang/hlsl/writer/output.cc
similarity index 82%
rename from src/tint/lang/hlsl/writer/result.cc
rename to src/tint/lang/hlsl/writer/output.cc
index 069545c..cd51ba3 100644
--- a/src/tint/lang/hlsl/writer/result.cc
+++ b/src/tint/lang/hlsl/writer/output.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/lang/hlsl/writer/result.h"
+#include "src/tint/lang/hlsl/writer/output.h"
 
 namespace tint::hlsl::writer {
 
-Result::Result() = default;
+Output::Output() = default;
 
-Result::~Result() = default;
+Output::~Output() = default;
 
-Result::Result(const Result&) = default;
+Output::Output(const Output&) = default;
 
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/result.h b/src/tint/lang/hlsl/writer/output.h
similarity index 73%
rename from src/tint/lang/hlsl/writer/result.h
rename to src/tint/lang/hlsl/writer/output.h
index 6de548d..f3e54f7 100644
--- a/src/tint/lang/hlsl/writer/result.h
+++ b/src/tint/lang/hlsl/writer/output.h
@@ -12,10 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_LANG_HLSL_WRITER_RESULT_H_
-#define SRC_TINT_LANG_HLSL_WRITER_RESULT_H_
+#ifndef SRC_TINT_LANG_HLSL_WRITER_OUTPUT_H_
+#define SRC_TINT_LANG_HLSL_WRITER_OUTPUT_H_
 
-#include <optional>
 #include <string>
 #include <unordered_set>
 #include <utility>
@@ -25,22 +24,16 @@
 
 namespace tint::hlsl::writer {
 
-/// The result produced when generating HLSL.
-struct Result {
+/// The output produced when generating HLSL.
+struct Output {
     /// Constructor
-    Result();
+    Output();
 
     /// Destructor
-    ~Result();
+    ~Output();
 
     /// Copy constructor
-    Result(const Result&);
-
-    /// True if generation was successful.
-    bool success = false;
-
-    /// The errors generated during code generation, if any.
-    std::string error;
+    Output(const Output&);
 
     /// The generated HLSL.
     std::string hlsl = "";
@@ -55,4 +48,4 @@
 
 }  // namespace tint::hlsl::writer
 
-#endif  // SRC_TINT_LANG_HLSL_WRITER_RESULT_H_
+#endif  // SRC_TINT_LANG_HLSL_WRITER_OUTPUT_H_
diff --git a/src/tint/lang/hlsl/writer/writer.cc b/src/tint/lang/hlsl/writer/writer.cc
index d8b7670..fa88e21 100644
--- a/src/tint/lang/hlsl/writer/writer.cc
+++ b/src/tint/lang/hlsl/writer/writer.cc
@@ -21,39 +21,38 @@
 
 namespace tint::hlsl::writer {
 
-Result Generate(const Program* program, const Options& options) {
-    Result result;
+Result<Output, std::string> Generate(const Program* program, const Options& options) {
     if (!program->IsValid()) {
-        result.error = "input program is not valid";
-        return result;
+        return std::string("input program is not valid");
     }
 
     // Sanitize the program.
     auto sanitized_result = Sanitize(program, options);
     if (!sanitized_result.program.IsValid()) {
-        result.success = false;
-        result.error = sanitized_result.program.Diagnostics().str();
-        return result;
+        return sanitized_result.program.Diagnostics().str();
     }
 
     // Generate the HLSL code.
     auto impl = std::make_unique<ASTPrinter>(&sanitized_result.program);
-    result.success = impl->Generate();
-    result.error = impl->Diagnostics().str();
-    result.hlsl = impl->Result();
+    if (!impl->Generate()) {
+        return impl->Diagnostics().str();
+    }
+
+    Output output;
+    output.hlsl = impl->Result();
 
     // Collect the list of entry points in the sanitized program.
     for (auto* func : sanitized_result.program.AST().Functions()) {
         if (func->IsEntryPoint()) {
             auto name = func->name->symbol.Name();
-            result.entry_points.push_back({name, func->PipelineStage()});
+            output.entry_points.push_back({name, func->PipelineStage()});
         }
     }
 
-    result.used_array_length_from_uniform_indices =
+    output.used_array_length_from_uniform_indices =
         std::move(sanitized_result.used_array_length_from_uniform_indices);
 
-    return result;
+    return output;
 }
 
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/writer.h b/src/tint/lang/hlsl/writer/writer.h
index 4c0410b..2d28d7f 100644
--- a/src/tint/lang/hlsl/writer/writer.h
+++ b/src/tint/lang/hlsl/writer/writer.h
@@ -15,8 +15,11 @@
 #ifndef SRC_TINT_LANG_HLSL_WRITER_WRITER_H_
 #define SRC_TINT_LANG_HLSL_WRITER_WRITER_H_
 
+#include <string>
+
 #include "src/tint/lang/hlsl/writer/common/options.h"
-#include "src/tint/lang/hlsl/writer/result.h"
+#include "src/tint/lang/hlsl/writer/output.h"
+#include "src/tint/utils/result/result.h"
 
 // Forward declarations
 namespace tint {
@@ -26,12 +29,11 @@
 namespace tint::hlsl::writer {
 
 /// Generate HLSL for a program, according to a set of configuration options.
-/// The result will contain the HLSL, as well as success status and diagnostic
-/// information.
+/// The result will contain the HLSL and supplementary information, or an error string.
 /// @param program the program to translate to HLSL
 /// @param options the configuration options to use when generating HLSL
-/// @returns the resulting HLSL and supplementary information
-Result Generate(const Program* program, const Options& options);
+/// @returns the resulting HLSL and supplementary information, or an error string
+Result<Output, std::string> Generate(const Program* program, const Options& options);
 
 }  // namespace tint::hlsl::writer
 
diff --git a/src/tint/lang/hlsl/writer/writer_bench.cc b/src/tint/lang/hlsl/writer/writer_bench.cc
index 7203ae9..1831f22 100644
--- a/src/tint/lang/hlsl/writer/writer_bench.cc
+++ b/src/tint/lang/hlsl/writer/writer_bench.cc
@@ -28,8 +28,8 @@
     auto& program = std::get<bench::ProgramAndFile>(res).program;
     for (auto _ : state) {
         auto res = Generate(&program, {});
-        if (!res.error.empty()) {
-            state.SkipWithError(res.error.c_str());
+        if (!res) {
+            state.SkipWithError(res.Failure().c_str());
         }
     }
 }
