Records, encapsulation and optional elements

Alex Peake <>
Tue May 21 07:03:37 CEST 2002


I am new to Erlang. Could someone please advise if the following is a
reasonable attempt at encapsulating the creation of records (with optional
elements)? Is there a more elegant way? It seems a shame that I can define
defaults (in the .hrl) and yet not use them (in an encapsulated way) in the
.erl.

Thanks,

Alex


%% File: attr.hrl

%%-----------------------------------------------------------
%% Data Type: attr
%% where:
%%    name:  A string (default is undefined).
%%    domain:  An atom (default is undefined).
%%    domLen:   An integer (default is undefined).
%%    domPrec:   An integer (default is undefined).
%%    nullable: A boolean (default is false).
%%    isPk: A boolean (default is false).
%%    pkPos: An integer (default is undefined).
%%    fkPos: An integer (default is undefined).
%%    fkRel:  A string (default is undefined).
%%    fkAttr:  A string (default is undefined).
%%    autonum: A boolean (default is false).
%%------------------------------------------------------------

-record(attr, {name, domain, domLen = 0, domPrec = 0, nullable = false, isPk
= false, pkPos, fkPos, fkRel, fkAttr, autonum = false}).






-module(attr).
-include("attr.hrl").
-export([make_attr/3, varName/1, label/1]).
-export([findNamed/2, findNamedC/1, findFromNameList/2]).

%%-----------------------------------------------------------
%% Data Type: attr
%% where:
%%    name:  A string (default is undefined).
%%    domain:  An atom (default is undefined).
%%    domLen:   An integer (default is undefined).
%%    domPrec:   An integer (default is undefined).
%%    nullable: A boolean (default is false).
%%    isPk: A boolean (default is false).
%%    pkPos: An integer (default is undefined).
%%    fkPos: An integer (default is undefined).
%%    fkRel:  A string (default is undefined).
%%    fkAttr:  A string (default is undefined).
%%    autonum: A boolean (default is false).
%%------------------------------------------------------------


%% Name and Domain are required arguments.
%% Options is a list of Tuples for the rest.
%% Example: [{nullable, true},{isPK, true},{pkPos,1}]
make_attr(Name, Domain, Options) ->
    DomLen = case lists:keysearch(domLen, 1, Options) of
		 {value,{domLen, Value}} ->
		     Value;
		 _ ->
		     undefined
	     end,
    DomPrec = case lists:keysearch(domPrec, 1, Options) of
		  {value,{domPrec, Value}} ->
		      Value;
		  _ ->
		      undefined
	      end,
    Nullable = case lists:keysearch(nullable, 1, Options) of
		   {value,{nullable, Value}} ->
		       Value;
		   _ ->
		       false
	       end,
    IsPk = case lists:keysearch(isPk, 1, Options) of
	       {value,{isPk, Value}} ->
		   Value;
	       _ ->
		   false
	   end,
    PkPos = case lists:keysearch(pkPos, 1, Options) of
		{value,{pkPos, Value}} ->
		    Value;
		_ ->
		    undefined
	    end,
    FkPos = case lists:keysearch(fkPos, 1, Options) of
		{value,{fkPos, Value}} ->
		    Value;
		_ ->
		    undefined
	    end,
    FkRel = case lists:keysearch(fkRel, 1, Options) of
		{value,{fkRel, Value}} ->
		    Value;
		_ ->
		    undefined
	    end,
    FkAttr = case lists:keysearch(fkAttr, 1, Options) of
		 {value,{fkAttr, Value}} ->
		     Value;
		 _ ->
		     undefined
	     end,
    Autonum = case lists:keysearch(autonum, 1, Options) of
		  {value,{autonum, Value}} ->
		      Value;
		  _ ->
		      false
	      end,
    #attr{name = Name, domain = Domain, domLen = DomLen, domPrec = DomPrec,
	  nullable = Nullable, isPk = IsPk, pkPos = PkPos, fkPos = FkPos,
	  fkRel = FkRel, fkAttr = FkAttr, autonum = Autonum}.





More information about the erlang-questions mailing list