sequenceDiagram
    box run.rs
        participant rn_mnt as run_mount
    end
    
    box mount.rs
        participant cr_mp as create_mount_point
    end
    
    box linux.rs
        participant mnt_point_impl_new as MountPointImpl::new
        participant mnt_point_impl_mount as MountPointImpl::mount
        participant mnt_fuse as mount_fuse
        participant enc_fs_fuse3 as EncryptedFsFuse3::new
    end
    
    box encryptedfs.rs
        participant enc_fs as EncryptedFs::new
        participant ensure_fs_created as ensure_structure_created
        participant ensure_root as EncryptedFs::ensure_root_exists
    end

    box fuse3/session.rs[external]
        participant session_new as Session::new
        participant mnt_with_unpriv as Session::mount_with_unpriviliged
    end
    
    rn_mnt -->> cr_mp : [mount_point,data_dir,password_provider,cipher ...]
    cr_mp -->> mnt_point_impl_new : [mount_point,data_dir,password_provider,cipher ...]
    mnt_point_impl_new -->> cr_mp : [mount_point] 
    cr_mp -->> rn_mnt :  [mount_point]
    
    rn_mnt -->> mnt_point_impl_mount : [mount_point,data_dir,password_provider,cipher,...]  
    mnt_point_impl_mount -->> mnt_fuse: [mount_point,data_dir,password_provider,cipher,...]  
    mnt_fuse -->> session_new : [mount_options]
    session_new -->> mnt_fuse : [fuse3_session]  
    mnt_fuse -->> enc_fs_fuse3 : [data_dir,password_provider,cipher,...]
    enc_fs_fuse3 -->> enc_fs : [data_dir,password_provider,cipher,...] 
    enc_fs -->> ensure_fs_created :  [data_dir]
    
    ensure_fs_created -->> enc_fs :  
    enc_fs -->> ensure_root : 
    ensure_root -->> enc_fs :  
    
    enc_fs -->> enc_fs_fuse3 : [EncryptedFs]
    enc_fs_fuse3 -->> mnt_fuse : [EncryptedFsFuse3] 
    mnt_fuse -->> mnt_with_unpriv : [EncryptedFsFuse3, mount_path]
    mnt_with_unpriv -->> mnt_fuse:  [mount_handle]
    mnt_fuse -->> mnt_point_impl_mount : [mount_handle] 
    mnt_point_impl_mount -->> rn_mnt : [mount_handle]