Browse Source

fix: io exception was not thrown well

Akeit0 7 months ago
parent
commit
2ef8081588
1 changed files with 27 additions and 2 deletions
  1. 27 2
      src/Lua/IO/ILuaFileSystem.cs

+ 27 - 2
src/Lua/IO/ILuaFileSystem.cs

@@ -64,6 +64,11 @@ public sealed class FileSystem : ILuaFileSystem
 
 
     public ILuaIOStream? Open(string path, LuaFileOpenMode luaMode, bool throwError)
     public ILuaIOStream? Open(string path, LuaFileOpenMode luaMode, bool throwError)
     {
     {
+        if (luaMode == LuaFileOpenMode.ReadAppend)
+        {
+            throw new NotSupportedException("a+ mode is not supported.");
+        }
+
         var (mode, access) = GetFileMode(luaMode);
         var (mode, access) = GetFileMode(luaMode);
         try
         try
         {
         {
@@ -108,6 +113,7 @@ public sealed class LuaIOStreamWrapper(Stream innerStream) : ILuaIOStream
 
 
     public ValueTask<string?> ReadLineAsync(CancellationToken cancellationToken)
     public ValueTask<string?> ReadLineAsync(CancellationToken cancellationToken)
     {
     {
+        ThrowIfNotReadable();
         reader ??= new(innerStream);
         reader ??= new(innerStream);
 
 
         return new(reader.ReadLine());
         return new(reader.ReadLine());
@@ -115,6 +121,7 @@ public sealed class LuaIOStreamWrapper(Stream innerStream) : ILuaIOStream
 
 
     public ValueTask<string> ReadToEndAsync(CancellationToken cancellationToken)
     public ValueTask<string> ReadToEndAsync(CancellationToken cancellationToken)
     {
     {
+        ThrowIfNotReadable();
         reader ??= new(innerStream);
         reader ??= new(innerStream);
 
 
         return new(reader.ReadToEnd());
         return new(reader.ReadToEnd());
@@ -122,6 +129,7 @@ public sealed class LuaIOStreamWrapper(Stream innerStream) : ILuaIOStream
 
 
     public ValueTask<string?> ReadStringAsync(int count, CancellationToken cancellationToken)
     public ValueTask<string?> ReadStringAsync(int count, CancellationToken cancellationToken)
     {
     {
+        ThrowIfNotReadable();
         reader ??= new(innerStream);
         reader ??= new(innerStream);
 
 
         using var byteBuffer = new PooledArray<char>(count);
         using var byteBuffer = new PooledArray<char>(count);
@@ -137,15 +145,16 @@ public sealed class LuaIOStreamWrapper(Stream innerStream) : ILuaIOStream
 
 
     public ValueTask WriteAsync(ReadOnlyMemory<char> buffer, CancellationToken cancellationToken)
     public ValueTask WriteAsync(ReadOnlyMemory<char> buffer, CancellationToken cancellationToken)
     {
     {
+        ThrowIfNotWritable();
         writer ??= new(innerStream);
         writer ??= new(innerStream);
-
         writer.Write(buffer.Span);
         writer.Write(buffer.Span);
         return new();
         return new();
     }
     }
 
 
     public ValueTask FlushAsync(CancellationToken cancellationToken)
     public ValueTask FlushAsync(CancellationToken cancellationToken)
     {
     {
-        innerStream.Flush();
+        ThrowIfNotWritable();
+        writer?.Flush();
         return new();
         return new();
     }
     }
 
 
@@ -161,5 +170,21 @@ public sealed class LuaIOStreamWrapper(Stream innerStream) : ILuaIOStream
     public bool CanSeek => innerStream.CanSeek;
     public bool CanSeek => innerStream.CanSeek;
     public bool CanWrite => innerStream.CanWrite;
     public bool CanWrite => innerStream.CanWrite;
 
 
+    void ThrowIfNotReadable()
+    {
+        if (!innerStream.CanRead)
+        {
+            throw new IOException("Stream is not readable.");
+        }
+    }
+
+    void ThrowIfNotWritable()
+    {
+        if (!innerStream.CanWrite)
+        {
+            throw new IOException("Stream is not writable.");
+        }
+    }
+
     public void Dispose() => innerStream.Dispose();
     public void Dispose() => innerStream.Dispose();
 }
 }