Red.git | lib/MetamodelX/Red/ | Describable.rakumod
use Red::DB;
use Red::Utils;
use Red::Cli::Table;
use Red::Cli::Column;
=head2 MetamodelX::Red::Describable
unit role MetamodelX::Red::Describable;
method !create-column($_ --> Red::Cli::Column) {
Red::Cli::Column.new:
:name(.column-name // self.column-formatter: .attr-name),
:formated-name(.attr-name),
:type(get-RED-DB.default-type-for($_)),
:perl-type(.type),
:nullable(.nullable),
:pk(.id),
|(:references(%(table => .ref.attr.package.^table, column => .ref.name)) if .references)
}
#| Returns an object of type `Red::Cli::Table` that represents
#| a database table of the caller.
method describe(\model --> Red::Cli::Table) {
Red::Cli::Table.new: :name(self.table(model)), :model-name(self.name(model)),
:columns(self.columns>>.column.map({self!create-column($_)}).cache)
}
#| Returns the difference to transform this model to the database version.
method diff-to-db(\model) {
model.^describe.diff: $*RED-DB.schema-reader.table-definition: model.^table
}
#| Returns the difference to transform the DB table into this model.
method diff-from-db(\model) {
$*RED-DB.schema-reader.table-definition(model.^table).diff: model.^describe
}
#| Returns the difference between two models.
method diff(\model, \other-model) {
model.^describe.diff: other-model.^describe
}