diff options
Diffstat (limited to 'util/elmgen.pl')
-rwxr-xr-x | util/elmgen.pl | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/util/elmgen.pl b/util/elmgen.pl new file mode 100755 index 00000000..d95aba58 --- /dev/null +++ b/util/elmgen.pl @@ -0,0 +1,204 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +use Cwd 'abs_path'; +my $ROOT; +BEGIN { ($ROOT = abs_path $0) =~ s{/util/elmgen\.pl$}{}; } +use lib $ROOT.'/lib'; +use TUWF; +use VN3::Validation; +use VN3::Auth; +use VN3::Types; +use VN3::VN::Edit; +use VN3::Release::Edit; +use VN3::Producer::Edit; +use VN3::Char::Edit; +use VN3::Staff::Edit; +use VN3::Docs::Edit; +use VN3::User::Settings; + +my $conf = require $ROOT.'/data/config3.pl'; + + +sub indent($) { $_[0] =~ s/\n/\n /gr } +sub list { indent "[ ".join("\n, ", @_)."\n]" } +sub string($) { '"'.($_[0] =~ s/([\\"])/\\$1/gr).'"' } +sub tuple { '('.join(', ', @_).')' } + +sub to_camel($) { (ucfirst $_[0]) =~ s/_([a-z])/'_'.uc $1/egr; } + +sub nested_type { + my($prefix, $obj) = @_; + my @keys = $obj->{keys} ? grep $obj->{keys}{$_}{keys}||($obj->{keys}{$_}{values}&&$obj->{keys}{$_}{values}{keys}), sort keys %{$obj->{keys}} : (); + + nested_type($prefix . to_camel $_, $obj->{keys}{$_}{values} || $obj->{keys}{$_}) for @keys; + + printf "type alias %s = %s\n\n", $prefix, $obj->elm_type( + keys => +{ map +($_, ($obj->{keys}{$_}{values} ? 'List ' : '') . $prefix . to_camel $_), @keys } + ); +} + +sub encoder { + my($name, $type, $obj) = @_; + printf "%s : %s -> JE.Value\n", $name, $type; + printf "%s = %s\n\n", $name, $obj->elm_encoder(json_encode => 'JE.'); +} + + + +my $perms = VN3::Auth::listPerms(); + +my $vn_lengths = list map tuple($_, string vn_length_display $_), 0..$#VN_LENGTHS; +my $vn_relations = list map tuple(string $_, string vn_relation_display $_), vn_relations; +my $producer_relations=list map tuple(string $_, string producer_relation_display $_), keys %PRODUCER_RELATIONS; +my $staff_roles = list map tuple(string $_, string $STAFF_ROLES{$_}), keys %STAFF_ROLES; +my $user_perms = list map tuple($perms->{$_}, string $_), sort keys %$perms; +my $languages = list map tuple(string $_, string $LANG{$_}), sort { $LANG{$a} cmp $LANG{$b} } keys %LANG; +my $platforms = list map tuple(string $_, string $PLATFORMS{$_}), keys %PLATFORMS; +my $release_types= list map string($_), release_types; +my $producer_types=list map tuple(string $_, string $PRODUCER_TYPES{$_}), keys %PRODUCER_TYPES; +my $minages = list map tuple($_, string minage_display_full $_), @MINAGE; +my $resolutions = list map tuple(string $_, string resolution_display_full $_), keys %RESOLUTIONS; +my $voiced = list map string($_), @VOICED; +my $animated = list map string($_), @ANIMATED; +my $gender = list map tuple(string $_, string gender_display $_), keys %GENDERS; +my $bloodt = list map tuple(string $_, string blood_type_display $_), keys %BLOOD_TYPES; +my $charroles = list map tuple(string $_, string char_role_display $_), keys %CHAR_ROLES; +my $media = list map tuple(string($_), sprintf('{ qty = %s, single = %s, plural = %s }', + $MEDIA{$_}{qty} ? 'True' : 'False', + string($MEDIA{$_}{single}), string($MEDIA{$_}{plural}))), keys %MEDIA; +my $vnlist_status= list map tuple($_, string $VNLIST_STATUS[$_]), 0..$#VNLIST_STATUS; +my $email = string { tuwf->compile({ email => 1 })->analyze->html5_validation() }->{pattern}; +my $weburl = string { tuwf->compile({ weburl => 1 })->analyze->html5_validation() }->{pattern}; +my $vnvote = string { tuwf->compile({ vnvote => 1 })->analyze->html5_validation() }->{pattern}; + + +print <<"EOF"; +-- This file is automatically generated from util/elmgen.pl +-- DO NOT EDIT! +module Lib.Gen exposing (..) + +import Json.Encode as JE + +urlStatic : String +urlStatic = "$conf->{url_static}" + +vnLengths : List (Int, String) +vnLengths = + $vn_lengths + +vnRelations : List (String, String) +vnRelations = + $vn_relations + +producerRelations : List (String, String) +producerRelations = + $producer_relations + +staffRoles : List (String, String) +staffRoles = + $staff_roles + +userPerms : List (Int, String) +userPerms = + $user_perms + +languages : List (String, String) +languages = + $languages + +platforms : List (String, String) +platforms = + $platforms + +releaseTypes : List String +releaseTypes = + $release_types + +producerTypes : List (String, String) +producerTypes = + $producer_types + +minAges : List (Int, String) +minAges = + $minages + +resolutions : List (String, String) +resolutions = + $resolutions + +voiced : List String +voiced = + $voiced + +animated : List String +animated = + $animated + +genders : List (String, String) +genders = + $gender + +bloodTypes : List (String, String) +bloodTypes = + $bloodt + +charRoles : List (String, String) +charRoles = + $charroles + +type alias Medium = + { qty : Bool + , single : String + , plural : String + } + +media : List (String, Medium) +media = + $media + +vnlistStatus : List (Int, String) +vnlistStatus = + $vnlist_status + +emailPattern : String +emailPattern = $email + +weburlPattern : String +weburlPattern = $weburl + +vnvotePattern : String +vnvotePattern = $vnvote + +EOF + + +nested_type VNEdit => $VN3::VN::Edit::FORM_OUT->analyze; +nested_type VNEditSend => $VN3::VN::Edit::FORM_IN->analyze; +encoder vneditSendEncode => VNEditSend => $VN3::VN::Edit::FORM_IN->analyze; + +nested_type RelEdit => $VN3::Release::Edit::FORM_OUT->analyze; +nested_type RelEditSend => $VN3::Release::Edit::FORM_IN->analyze; +encoder releditSendEncode => RelEditSend => $VN3::Release::Edit::FORM_IN->analyze; + +nested_type ProdEdit => $VN3::Producer::Edit::FORM_OUT->analyze; +nested_type ProdEditSend => $VN3::Producer::Edit::FORM_IN->analyze; +encoder prodeditSendEncode => ProdEditSend => $VN3::Producer::Edit::FORM_IN->analyze; + +nested_type CharEdit => $VN3::Char::Edit::FORM_OUT->analyze; +nested_type CharEditSend => $VN3::Char::Edit::FORM_IN->analyze; +encoder chareditSendEncode => CharEditSend => $VN3::Char::Edit::FORM_IN->analyze; + +nested_type StaffEdit => $VN3::Staff::Edit::FORM_OUT->analyze; +nested_type StaffEditSend => $VN3::Staff::Edit::FORM_IN->analyze; +encoder staffeditSendEncode => StaffEditSend => $VN3::Staff::Edit::FORM_IN->analyze; + +nested_type DocEdit => $VN3::Docs::Edit::FORM_OUT->analyze; +nested_type DocEditSend => $VN3::Docs::Edit::FORM_IN->analyze; +encoder doceditSendEncode => DocEditSend => $VN3::Docs::Edit::FORM_IN->analyze; + +nested_type UserEdit => $VN3::User::Settings::FORM_OUT->analyze; +nested_type UserEditSend => $VN3::User::Settings::FORM_IN->analyze; +encoder usereditSendEncode => UserEditSend => $VN3::User::Settings::FORM_IN->analyze; |