Change reader to return unique_ptr<File>
diff --git a/include/rive/file.hpp b/include/rive/file.hpp
index b11ef0e..29f28e2 100644
--- a/include/rive/file.hpp
+++ b/include/rive/file.hpp
@@ -55,13 +55,12 @@
         ///
         /// Imports a Rive file from a binary buffer.
         /// @param reader a pointer to a binary reader attached to the file.
-        /// @param importedFile a handle to a file that will contain the
-        /// imported data.
+        /// @param result is an optional status result.
         /// @param assetResolver is an optional helper to resolve assets which
         /// cannot be found in-band.
-        /// @returns whether the import was successful or an error occurred.
-        static ImportResult import(BinaryReader& reader,
-                                   File** importedFile,
+        /// @returns a pointer to the file, or null on failure.
+        static std::unique_ptr<File> import(BinaryReader& reader,
+                                   ImportResult* result  = nullptr,
                                    FileAssetResolver* assetResolver = nullptr);
 
         /// @returns the file's backboard. All files have exactly one backboard.
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp
index 1ff6fbb..4cc2c90 100644
--- a/skia/viewer/src/main.cpp
+++ b/skia/viewer/src/main.cpp
@@ -47,18 +47,19 @@
     animationIndex = -1;
     assert(fileBytes != nullptr);
     auto reader = rive::BinaryReader(fileBytes, fileBytesLength);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file);
-    if (result != rive::ImportResult::success) {
+    auto file = rive::File::import(reader);
+    if (!file) {
         delete[] fileBytes;
         fprintf(stderr, "failed to import file\n");
         return;
     }
-    artboard = file->artboard()->instance();
-    artboard->advance(0.0f);
-
     delete animationInstance;
     delete stateMachineInstance;
+    currentFile = std::move(file);
+
+    artboard = currentFile->artboard()->instance();
+    artboard->advance(0.0f);
+
     animationInstance = nullptr;
     stateMachineInstance = nullptr;
 
@@ -68,8 +69,6 @@
     if (stateMachine != nullptr) {
         stateMachineInstance = new rive::StateMachineInstance(stateMachine);
     }
-
-    currentFile.reset(file);
 }
 
 void initAnimation(int index) {
@@ -77,18 +76,19 @@
     stateMachineIndex = -1;
     assert(fileBytes != nullptr);
     auto reader = rive::BinaryReader(fileBytes, fileBytesLength);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file);
-    if (result != rive::ImportResult::success) {
+    auto file = rive::File::import(reader);
+    if (!file) {
         delete[] fileBytes;
         fprintf(stderr, "failed to import file\n");
         return;
     }
-    artboard = file->artboard()->instance();
-    artboard->advance(0.0f);
-
     delete animationInstance;
     delete stateMachineInstance;
+    currentFile = std::move(file);
+
+    artboard = currentFile->artboard()->instance();
+    artboard->advance(0.0f);
+
     animationInstance = nullptr;
     stateMachineInstance = nullptr;
 
@@ -97,8 +97,6 @@
     if (animation != nullptr) {
         animationInstance = new rive::LinearAnimationInstance(animation);
     }
-
-    currentFile.reset(file);
 }
 
 void glfwErrorCallback(int error, const char* description) { puts(description); }
diff --git a/src/file.cpp b/src/file.cpp
index f83d658..eb4577d 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -111,12 +111,15 @@
 File::~File() {}
 
 // Import a Rive file from a file handle
-ImportResult
-File::import(BinaryReader& reader, File** importedFile, FileAssetResolver* assetResolver) {
+std::unique_ptr<File>
+File::import(BinaryReader& reader, ImportResult* result, FileAssetResolver* assetResolver) {
     RuntimeHeader header;
     if (!RuntimeHeader::read(reader, header)) {
         fprintf(stderr, "Bad header\n");
-        return ImportResult::malformed;
+        if (result) {
+            *result = ImportResult::malformed;
+        }
+        return nullptr;
     }
     if (header.majorVersion() != majorVersion) {
         fprintf(stderr,
@@ -125,16 +128,20 @@
                 header.minorVersion(),
                 majorVersion,
                 minorVersion);
-        return ImportResult::unsupportedVersion;
+        if (result) {
+            *result = ImportResult::unsupportedVersion;
+        }
+        return nullptr;
     }
-    auto file = new File(assetResolver);
-    auto result = file->read(reader, header);
-    if (result != ImportResult::success) {
-        delete file;
-        return result;
+    auto file = std::unique_ptr<File>(new File(assetResolver));
+    auto readResult = file->read(reader, header);
+    if (readResult != ImportResult::success) {
+        file.reset(nullptr);
     }
-    *importedFile = file;
-    return result;
+    if (result) {
+        *result = ImportResult::success;
+    }
+    return file;
 }
 
 ImportResult File::read(BinaryReader& reader, const RuntimeHeader& header) {
diff --git a/test/image_asset_test.cpp b/test/image_asset_test.cpp
index 5e8e5c1..04d1276 100644
--- a/test/image_asset_test.cpp
+++ b/test/image_asset_test.cpp
@@ -55,10 +55,8 @@
     uint8_t* bytes = new uint8_t[length];
     REQUIRE(fread(bytes, 1, length, fp) == length);
     auto reader = rive::BinaryReader(bytes, length);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file, &resolver);
+    auto file = rive::File::import(reader, nullptr, &resolver);
 
-    REQUIRE(result == rive::ImportResult::success);
     REQUIRE(file != nullptr);
     REQUIRE(file->artboard() != nullptr);
 
@@ -88,6 +86,5 @@
     rive::NoOpRenderer renderer;
     file->artboard()->draw(&renderer);
 
-    delete file;
     delete[] bytes;
 }
diff --git a/test/instancing_test.cpp b/test/instancing_test.cpp
index 25493b3..c7a11fd 100644
--- a/test/instancing_test.cpp
+++ b/test/instancing_test.cpp
@@ -18,10 +18,8 @@
     uint8_t* bytes = new uint8_t[length];
     REQUIRE(fread(bytes, 1, length, fp) == length);
     auto reader = rive::BinaryReader(bytes, length);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file);
+    auto file = rive::File::import(reader);
 
-    REQUIRE(result == rive::ImportResult::success);
     REQUIRE(file != nullptr);
     REQUIRE(file->artboard() != nullptr);
 
@@ -33,8 +31,6 @@
     REQUIRE(node->y() == clonedNode->y());
 
     delete clonedNode;
-
-    delete file;
     delete[] bytes;
 }
 
@@ -48,10 +44,8 @@
     uint8_t* bytes = new uint8_t[length];
     REQUIRE(fread(bytes, 1, length, fp) == length);
     auto reader = rive::BinaryReader(bytes, length);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file);
+    auto file = rive::File::import(reader);
 
-    REQUIRE(result == rive::ImportResult::success);
     REQUIRE(file != nullptr);
     REQUIRE(file->artboard() != nullptr);
     REQUIRE(!file->artboard()->isInstance());
@@ -74,7 +68,6 @@
     rive::NoOpRenderer renderer;
     artboard->draw(&renderer);
 
-    delete file;
     delete[] bytes;
 }
 
@@ -88,10 +81,8 @@
     uint8_t* bytes = new uint8_t[length];
     REQUIRE(fread(bytes, 1, length, fp) == length);
     auto reader = rive::BinaryReader(bytes, length);
-    rive::File* file = nullptr;
-    auto result = rive::File::import(reader, &file);
+    auto file = rive::File::import(reader);
 
-    REQUIRE(result == rive::ImportResult::success);
     REQUIRE(file != nullptr);
     REQUIRE(file->artboard() != nullptr);
 
@@ -105,7 +96,7 @@
     REQUIRE(rive::LinearAnimation::deleteCount == 0);
 
     int numberOfAnimations = file->artboard()->animationCount();
-    delete file;
+    file.reset(nullptr);
     // Now the animations should've been deleted.
     REQUIRE(rive::LinearAnimation::deleteCount == numberOfAnimations);
 
diff --git a/test/rive_file_reader.hpp b/test/rive_file_reader.hpp
index b18d062..f62e1e8 100644
--- a/test/rive_file_reader.hpp
+++ b/test/rive_file_reader.hpp
@@ -6,7 +6,7 @@
 #include "rive_testing.hpp"
 
 class RiveFileReader {
-    rive::File* m_File = nullptr;
+    std::unique_ptr<rive::File> m_File;
     uint8_t* m_Bytes = nullptr;
     rive::BinaryReader* m_Reader;
 
@@ -21,19 +21,19 @@
         m_Bytes = new uint8_t[length];
         REQUIRE(fread(m_Bytes, 1, length, fp) == length);
         m_Reader = new rive::BinaryReader(m_Bytes, length);
-        auto result = rive::File::import(*m_Reader, &m_File);
+        rive::ImportResult result;
+        m_File = rive::File::import(*m_Reader, &result);
 
         REQUIRE(result == rive::ImportResult::success);
         REQUIRE(m_File != nullptr);
         REQUIRE(m_File->artboard() != nullptr);
     }
     ~RiveFileReader() {
-        delete m_File;
         delete m_Reader;
         delete[] m_Bytes;
     }
 
-    rive::File* file() const { return m_File; }
+    rive::File* file() const { return m_File.get(); }
 };
 
 #endif