Files
2023-03-12 20:34:16 +00:00

274 lines
7.2 KiB
C#

// Copyright (c) 2021 homuler
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
using System;
using System.Runtime.InteropServices;
namespace Mediapipe
{
public class Status : MpResourceHandle
{
public enum StatusCode : int
{
Ok = 0,
Cancelled = 1,
Unknown = 2,
InvalidArgument = 3,
DeadlineExceeded = 4,
NotFound = 5,
AlreadyExists = 6,
PermissionDenied = 7,
ResourceExhausted = 8,
FailedPrecondition = 9,
Aborted = 10,
OutOfRange = 11,
Unimplemented = 12,
Internal = 13,
Unavailable = 14,
DataLoss = 15,
Unauthenticated = 16,
}
[StructLayout(LayoutKind.Sequential)]
public readonly struct StatusArgs
{
private readonly StatusCode _code;
private readonly IntPtr _message;
private StatusArgs(StatusCode code, string message = null)
{
_code = code;
_message = Marshal.StringToHGlobalAnsi(message);
}
public static StatusArgs Ok()
{
return new StatusArgs(StatusCode.Ok);
}
public static StatusArgs Cancelled(string message = null)
{
return new StatusArgs(StatusCode.Cancelled, message);
}
public static StatusArgs Unknown(string message = null)
{
return new StatusArgs(StatusCode.Unknown, message);
}
public static StatusArgs InvalidArgument(string message = null)
{
return new StatusArgs(StatusCode.InvalidArgument, message);
}
public static StatusArgs DeadlineExceeded(string message = null)
{
return new StatusArgs(StatusCode.DeadlineExceeded, message);
}
public static StatusArgs NotFound(string message = null)
{
return new StatusArgs(StatusCode.NotFound, message);
}
public static StatusArgs AlreadyExists(string message = null)
{
return new StatusArgs(StatusCode.AlreadyExists, message);
}
public static StatusArgs PermissionDenied(string message = null)
{
return new StatusArgs(StatusCode.PermissionDenied, message);
}
public static StatusArgs ResourceExhausted(string message = null)
{
return new StatusArgs(StatusCode.ResourceExhausted, message);
}
public static StatusArgs FailedPrecondition(string message = null)
{
return new StatusArgs(StatusCode.FailedPrecondition, message);
}
public static StatusArgs Aborted(string message = null)
{
return new StatusArgs(StatusCode.Aborted, message);
}
public static StatusArgs OutOfRange(string message = null)
{
return new StatusArgs(StatusCode.OutOfRange, message);
}
public static StatusArgs Unimplemented(string message = null)
{
return new StatusArgs(StatusCode.Unimplemented, message);
}
public static StatusArgs Internal(string message = null)
{
return new StatusArgs(StatusCode.Internal, message);
}
public static StatusArgs Unavailable(string message = null)
{
return new StatusArgs(StatusCode.Unavailable, message);
}
public static StatusArgs DataLoss(string message = null)
{
return new StatusArgs(StatusCode.DataLoss, message);
}
public static StatusArgs Unauthenticated(string message = null)
{
return new StatusArgs(StatusCode.Unauthenticated, message);
}
}
public Status(IntPtr ptr, bool isOwner = true) : base(ptr, isOwner) { }
protected override void DeleteMpPtr()
{
UnsafeNativeMethods.absl_Status__delete(ptr);
}
private bool? _ok;
private int? _rawCode;
public void AssertOk()
{
if (!Ok())
{
throw new MediaPipeException(ToString());
}
}
public bool Ok()
{
if (_ok is bool valueOfOk)
{
return valueOfOk;
}
_ok = SafeNativeMethods.absl_Status__ok(mpPtr);
return (bool)_ok;
}
public StatusCode Code()
{
return (StatusCode)RawCode();
}
public int RawCode()
{
if (_rawCode is int valueOfRawCode)
{
return valueOfRawCode;
}
_rawCode = SafeNativeMethods.absl_Status__raw_code(mpPtr);
return (int)_rawCode;
}
public override string ToString()
{
return MarshalStringFromNative(UnsafeNativeMethods.absl_Status__ToString);
}
public static Status Build(StatusCode code, string message, bool isOwner = true)
{
UnsafeNativeMethods.absl_Status__i_PKc((int)code, message, out var ptr).Assert();
return new Status(ptr, isOwner);
}
public static Status Ok(bool isOwner = true)
{
return Build(StatusCode.Ok, "", isOwner);
}
public static Status Cancelled(string message = "", bool isOwner = true)
{
return Build(StatusCode.Cancelled, message, isOwner);
}
public static Status Unknown(string message = "", bool isOwner = true)
{
return Build(StatusCode.Unknown, message, isOwner);
}
public static Status InvalidArgument(string message = "", bool isOwner = true)
{
return Build(StatusCode.InvalidArgument, message, isOwner);
}
public static Status DeadlineExceeded(string message = "", bool isOwner = true)
{
return Build(StatusCode.DeadlineExceeded, message, isOwner);
}
public static Status NotFound(string message = "", bool isOwner = true)
{
return Build(StatusCode.NotFound, message, isOwner);
}
public static Status AlreadyExists(string message = "", bool isOwner = true)
{
return Build(StatusCode.AlreadyExists, message, isOwner);
}
public static Status PermissionDenied(string message = "", bool isOwner = true)
{
return Build(StatusCode.PermissionDenied, message, isOwner);
}
public static Status ResourceExhausted(string message = "", bool isOwner = true)
{
return Build(StatusCode.ResourceExhausted, message, isOwner);
}
public static Status FailedPrecondition(string message = "", bool isOwner = true)
{
return Build(StatusCode.FailedPrecondition, message, isOwner);
}
public static Status Aborted(string message = "", bool isOwner = true)
{
return Build(StatusCode.Aborted, message, isOwner);
}
public static Status OutOfRange(string message = "", bool isOwner = true)
{
return Build(StatusCode.OutOfRange, message, isOwner);
}
public static Status Unimplemented(string message = "", bool isOwner = true)
{
return Build(StatusCode.Unimplemented, message, isOwner);
}
public static Status Internal(string message = "", bool isOwner = true)
{
return Build(StatusCode.Internal, message, isOwner);
}
public static Status Unavailable(string message = "", bool isOwner = true)
{
return Build(StatusCode.Unavailable, message, isOwner);
}
public static Status DataLoss(string message = "", bool isOwner = true)
{
return Build(StatusCode.DataLoss, message, isOwner);
}
public static Status Unauthenticated(string message = "", bool isOwner = true)
{
return Build(StatusCode.Unauthenticated, message, isOwner);
}
}
}