rec { buildSiteTo = prefix: site: builtins.toString (builtins.attrValues (builtins.mapAttrs (name: content: if builtins.isString content then '' cp ${builtins.toFile name content} ${prefix}/${name} '' else if builtins.isPath content then '' cp -r ${content} ${prefix}/${name} '' else if builtins.isAttrs content && content ? "__toString" then '' cp ${builtins.toFile name (toString content)} ${prefix}/${name} '' else if builtins.isAttrs content then '' mkdir -p ${prefix}/${name} ${buildSiteTo "${prefix}/${name}" content} '' else throw "Site page must be string, path or attrset, but got ${ builtins.typeOf content }: [${toString content}]") site)); }