Red.git | lib/Red/Cli/ | Column.rakumod
use Red::Utils;
use Red::DB;
unit class Red::Cli::Column;
has $.table is rw;
has Str $.name is required;
has Str $.formated-name = snake-to-kebab-case $!name;
has Str $.type is required;
has Str $.perl-type = get-RED-DB.type-for-sql: $!type.lc;
has Bool $.nullable = True;
has Bool $.pk = False;
has Bool $.unique = False;
has $.references = {};
multi method new($name, $type, $nullable, $pk, $unique, $references) {
self.bless: :$name, :$type, :nullble(?$nullable), :pk(?$pk), :unique(?$unique), :$references
}
multi method gist(::?CLASS:D:) {
"Red::Cli::Column.new(:name($!name), :type($!type), :nullable($!nullable), :pk($!pk), :unique($!unique), {
":references($_)" with $!references
} #`( table => $!table.name() ))"
}
method !modifier(Str :$schema-class) {
do given self {
when ?.pk { "id" }
when ?.references {
qq:to/END/.chomp;
referencing\{{
[
"\n:model<{
snake-to-camel-case self.references<table>
}>",
"\n:column<{
snake-to-kebab-case self.references<column>
}>",
("\n:require<{ $schema-class }>" with $schema-class)
].join(",").indent: 4
}
}
END
}
default { "column" }
}
}
method to-code(Str :$schema-class) {
"has {$!perl-type} \$.{ $!formated-name } is {
self!modifier(
|(:$schema-class with $schema-class)
).chomp
};"
}
method diff(::?CLASS $b) {
my @diffs;
if self.name ne $b.name {
@diffs.push: [ $!name, "+", "name", $b.name ];
@diffs.push: [ $!name, "-", "name", self.name ];
}
if self.type ne $b.type {
@diffs.push: [ $!name, "+", "type", $b.type ];
@diffs.push: [ $!name, "-", "type", self.type ];
}
if self.nullable != $b.nullable {
@diffs.push: [ $!name, "+", "nullable", $b.nullable ];
@diffs.push: [ $!name, "-", "nullable", self.nullable ];
}
if self.pk != $b.pk {
@diffs.push: [ $!name, "+", "pk", $b.pk ];
@diffs.push: [ $!name, "-", "pk", self.pk ];
}
if self.unique != $b.unique {
@diffs.push: [ $!name, "+", "unique", $b.unique ];
@diffs.push: [ $!name, "-", "unique", self.unique ];
}
if quietly ?self.references<table> and ?$b.references<table>
and self.references<table> ne $b.references<table>
or self.references<column> ne $b.references<column>
{
@diffs.push: [ $!name, "+", "references", $b.references ];
@diffs.push: [ $!name, "-", "references", self.references ];
}
@diffs
}