RTL refactoring
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
unit Myc.Ast.RTL.DateTime;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils,
|
||||
System.DateUtils,
|
||||
Myc.Data.Scalar,
|
||||
Myc.Data.Value,
|
||||
Myc.Ast.Attributes;
|
||||
|
||||
type
|
||||
TRtlDateTimeFunctions = record
|
||||
public
|
||||
[TRtlExport('now', Impure)]
|
||||
[AstDoc('Returns the current system timestamp.')]
|
||||
[AstSignature('() -> datetime')]
|
||||
class function Now(const Args: TArray<TDataValue>): TDataValue; static;
|
||||
|
||||
[TRtlExport('date', Impure)]
|
||||
[AstDoc('Returns the current date or constructs a date from Y, M, D.')]
|
||||
[AstSignature('() -> datetime')]
|
||||
[AstSignature('(number, number, number) -> datetime')]
|
||||
class function Date(const Args: TArray<TDataValue>): TDataValue; static;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TRtlDateTimeFunctions }
|
||||
|
||||
class function TRtlDateTimeFunctions.Now(const Args: TArray<TDataValue>): TDataValue;
|
||||
begin
|
||||
Result := TScalar.FromDateTime(System.SysUtils.Now);
|
||||
end;
|
||||
|
||||
class function TRtlDateTimeFunctions.Date(const Args: TArray<TDataValue>): TDataValue;
|
||||
|
||||
function GetInt(const V: TDataValue; ArgIndex: Integer): Word;
|
||||
begin
|
||||
if V.AsScalar.Kind <> TScalar.TKind.Ordinal then
|
||||
raise EArgumentException.CreateFmt('Date argument %d must be an Integer.', [ArgIndex]);
|
||||
Result := V.AsScalar.Value.AsInt64;
|
||||
end;
|
||||
|
||||
begin
|
||||
if Length(Args) = 3 then
|
||||
begin
|
||||
var y := GetInt(Args[0], 1);
|
||||
var m := GetInt(Args[1], 2);
|
||||
var d := GetInt(Args[2], 3);
|
||||
Result := TScalar.FromDateTime(EncodeDate(y, m, d));
|
||||
end
|
||||
else if Length(Args) = 0 then
|
||||
Result := TScalar.FromDateTime(System.SysUtils.Date)
|
||||
else
|
||||
raise EArgumentException.Create('Date expects 0 or 3 arguments (Year, Month, Day).');
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user