123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openDatamoduleMd=Markdownletpackage=Package.package~name:"project"~title:"Project Management"~readme:"project.md"()moduleJproject_id=Jintlet_current_project_signal=States.register_state~package~name:"current"~descr:(Md.plain"Current Frama-C project")~data:(moduleJproject_id)~get:(fun()->Project.(current()|>get_pid))~set:(funpid->Project.(from_pidpid|>set_current))~add_hook:(Project.register_after_set_current_hook~user_only:false)()let()=Request.register~package~kind:`SET~name:"create"~descr:(Md.plain"Creates a new Frama-C project with the given name")~input:(moduleJstring)~output:(moduleJunit)(funname->Project.createname|>Project.set_current)letno_project_foundpid=Format.asprintf"No project with id %d found."pidlet()=Request.register~package~kind:`SET~name:"rename"~descr:(Md.plain"Rename a project")~input:(moduleJpair(Jproject_id)(Jstring))~output:(moduleJoption(Jstring))(fun(project_id,new_name)->tryletproject=Project.from_pidproject_idinProject.set_nameprojectnew_name;NonewithProject.Unknown_project->leterr=no_project_foundproject_idinSomeerr)let()=Request.register~package~kind:`SET~name:"remove"~descr:(Md.plain"Remove a project from the session")~input:(moduleJproject_id)~output:(moduleJoption(Jstring))(funproject_id->tryletproject=Project.from_pidproject_idinProject.remove~project();Nonewith|Project.Unknown_project->leterr=no_project_foundproject_idinSomeerr|Project.Cannot_removep->leterr=Format.asprintf"Cannot remove project %s."pinSomeerr)let()=Request.register~package~kind:`SET~name:"copy"~descr:(Md.plain"Duplicate a project")~input:(moduleJpair(Jproject_id)(Jstring))~output:(moduleJoption(Jstring))(fun(project_id,new_name)->tryletproject=Project.from_pidproject_idinlet_=Project.create_by_copy~last:false~src:projectnew_nameinNonewithProject.Unknown_project->leterr=no_project_foundproject_idinSomeerr)let()=Request.register~package~kind:`SET~name:"load"~descr:(Md.plain"Load a saved project")~input:(moduleJfile)~output:(moduleJoption(Jstring))(funfilepath->tryProject.loadfilepath|>Project.set_current;NonewithProject.IOErrorerr->Someerr)let()=Request.register~package~kind:`SET~name:"save"~descr:(Md.plain"Save a project on disk")~input:(moduleJpair(Jproject_id)(Jfile))~output:(moduleJoption(Jstring))(fun(project_id,filepath)->tryletproject=Project.from_pidproject_idinProject.save~projectfilepath;Nonewith|Project.Unknown_project->leterr=no_project_foundproject_idinSomeerr|Project.IOErrorerr->Someerr)let_project_list=letmodel=States.model()inStates.columnmodel~name:"id"~descr:(Md.plain"Project ID")~data:(moduleJproject_id)~get:Project.get_pid;States.columnmodel~name:"name"~descr:(Md.plain"Project name")~data:(moduleJstring)~get:Project.get_name;letadd_update_hookf=Project.register_create_hookf;Project.register_after_load_hookf;Project.register_after_set_name_hook(fun(p,_)->fp);inletadd_remove_hookf=Project.register_before_remove_hookfinletadd_reload_hookf=Project.register_after_global_load_hookf;inStates.register_array~package~name:"list"~descr:(Md.plain"List of Frama-C projects")~key:(funp->Project.get_pidp|>string_of_int)~iter:Project.iter_on_projects~add_update_hook~add_remove_hook~add_reload_hookmodel